Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос ! [D7, XP]


petvv ©   (2007-07-09 07:49:00) 

Такая задача D2007+BDE+Paradox:
Необходимо из таблицы выбрать данные за два периода по одним и тем же полям, чтобы сделать сравнительный анализ, делаю так:

select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta,
"" Marka1, "" Name1, "" Litr1, "" Summa1, "" Delta1
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:DtB and TotOsnov.ShiftTo<=:DtE
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
union
select Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
SUM(TotOsnov.Cur) Summa,
((SUM(TotOsnov.Lit)*0)-SUM(TotOsnov.Cur)) Delta,
"" Marka1, "" Name1, "" Litr1, "" Summa1, "" Delta1
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:DtB and TotOsnov.ShiftTo<=:DtE
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0
union
select "" Marka, "" Name, "" Litr, "" Summa, "" Delta,
Fuel.Marka Marka1, Osnovan.Name Name1, SUM(TotOsnov.Lit) Litr1,
SUM(TotOsnov.Cur) Summa1,
((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta1
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:DtB1 and TotOsnov.ShiftTo<=:DtE1
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)<>0
union
select "" Marka, "" Name, "" Litr, "" Summa, "" Delta,
Fuel.Marka Marka1, Osnovan.Name Name1, SUM(TotOsnov.Lit) Litr1,
SUM(TotOsnov.Cur) Summa1,
((SUM(TotOsnov.Lit)*0)-SUM(TotOsnov.Cur)) Delta1
from Fuel, TotOsnov, Osnovan
where
TotOsnov.ShiftTo>=:DtB1 and TotOsnov.ShiftTo<=:DtE1
and
TotOsnov.Product=Fuel.Num
and
TotOsnov.Osnovanye=Osnovan.Num
group by Marka, Name
having SUM(TotOsnov.Cur)=0

но ругается на несовпадение типов, ну это и логично.
Теперь вопрос. Как задать тип поля "" Marka1 as ... и т.д. для Paradox.
Тока сильно не пинайте.


evvcom   (2007-07-09 12:06:00) [1]


> Да он и так знает.
>  SELECT "" Litr
>  UNIOM
>  SUM(TotOsnov.Lit) Litr

Ну здесь видно, а кашу из [0] мне лениво было разбирать.


ЮЮ   (2007-07-09 11:36:00) [2]

> Чтобы определить, в каких частях идет несоответствие типов,
> отключи все кроме 2-х и компильни


Да он и так знает.
 SELECT "" Litr
 UNIOM
 SUM(TotOsnov.Lit) Litr

в одном случае строка, в другом, очевидно, чиcло.
Вместо '' можнj было бы использовать MULL, но только не в первом подзапросе.
Остается 0. Или отказ от полей=дубликатов  (см. [1] ЮЮ)


evvcom   (2007-07-09 11:22:00) [3]

Чтобы определить, в каких частях идет несоответствие типов, отключи все кроме 2-х и компильни, в случае удачи последовательно подключай по 1-ой части (union).

Кстати, ты уверен, что тебе нужен union, а не union all?


ЮЮ   (2007-07-09 10:07:00) [4]

Привести поля к одному типу/размерности во всех частях объединенного запроса, используя CAST.

А ещё можно, не дублировать поля, а ввести доп.поле для идентификации выборки:

select
  1 SelBumber, Fuel.Marka, Osnovan.Name, SUM(TotOsnov.Lit) Litr,
 SUM(TotOsnov.Cur) Summa,
 ((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta
from Fuel, TotOsnov, Osnovan
...
select
  3, Fuel.Marka Marka1, Osnovan.Name Name1, SUM(TotOsnov.Lit) Litr1,
 SUM(TotOsnov.Cur) Summa1,
 ((SUM(TotOsnov.Lit)*Fuel.Price)-SUM(TotOsnov.Cur)) Delta1
from Fuel, TotOsnov, Osnovan
...


тогда типы полей будут одинаковы.
P.S. Алиасы полей в последующих запросахне обязательны, имена полей пормируются по алиасам в превом запросе


Наверх

Титульная страница Поиск, карта сайта Написать письмо