Текущий архив: 2007.08.05;
Скачать: CL | DM;
Вниз
SQL запрос ! Найти похожие ветки
← →
petvv © (2007-07-09 07:49) [0]Такая задача 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.
Тока сильно не пинайте.
← →
ЮЮ © (2007-07-09 10:07) [1]Привести поля к одному типу/размерности во всех частях объединенного запроса, используя 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. Алиасы полей в последующих запросах не обязательны, имена полей пормируются по алиасам в превом запросе
← →
evvcom © (2007-07-09 11:22) [2]Чтобы определить, в каких частях идет несоответствие типов, отключи все кроме 2-х и компильни, в случае удачи последовательно подключай по 1-ой части (union).
Кстати, ты уверен, что тебе нужен union, а не union all?
← →
ЮЮ © (2007-07-09 11:36) [3]> Чтобы определить, в каких частях идет несоответствие типов,
> отключи все кроме 2-х и компильни
Да он и так знает.
SELECT "" Litr
UNIOM
SUM(TotOsnov.Lit) Litr
в одном случае строка, в другом, очевидно, чиcло.
Вместо "" можнj было бы использовать MULL, но только не в первом подзапросе.
Остается 0. Или отказ от полей=дубликатов (см. [1] ЮЮ)
← →
evvcom © (2007-07-09 12:06) [4]
> Да он и так знает.
> SELECT "" Litr
> UNIOM
> SUM(TotOsnov.Lit) Litr
Ну здесь видно, а кашу из [0] мне лениво было разбирать.
Страницы: 1 вся ветка
Текущий архив: 2007.08.05;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.026 c