![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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. Алиасы полей в последующих запросахне обязательны, имена полей пормируются по алиасам в превом запросе