![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
SQL запрос. Сумма по 2 таблицам. Уже 2 часа думаю [D6, IB6.x]
Ops © (2003-01-14 16:08:00)Есть две таблицы одинаковые
Таблица 1
дата1 сумма1
дата1 сумма2
дата1 сумма3
дата2 сумма4
Таблица 2
дата1 сумма1
дата1 сумма2
дата1 сумма3
дата2 сумма4
Нужно получить
Дыта1 SUM(СуммаДыта1Taбл1) + SUM(СуммаДыта1Taбл2)
Дыта2 SUM(СуммаДыта2Taбл1) + SUM(СуммаДыта2Taбл2)
Ops (2003-01-15 15:42:00) [1]Решение оказалось через view
CREATE VIEW SUMMAALL(
SUMMA,
DTOPEZ,
TIP_OPEZ)
AS
SELECT SUM( R.summa ) SUM_OF_SUMMAOPEZ,
R.dtopez, "1"
FROM viewallproc2 R
GROUP BY R.dtopez
union
SELECT SUM( R.summa ) SUM_OF_SUMMAOPEZ,
R.dtopez, "2"
FROM viewallproD2 R
GROUP BY R.dtopez
union
SELECT SUM( R.summa ) SUM_OF_SUMMAOPEZ,
R.dtopez, "3"
FROM viewallproDA2 R
GROUP BY R.dtopez;
Потом уже через это view
SELECT SUM( SUMMAALL.SUMMA ) SUM_OF_SUMMA, SUMMAALL.DTOPEZ
FROM SUMMAALL
GROUP BY SUMMAALL.DTOPEZ
ORDER BY SUMMAALL.DTOPEZ DESC
Всем спасибо...
Alexandr (2003-01-15 14:05:00) [2]угу. Но, видать нехватка клея\udf\ума сказывается...
Sergey13 (2003-01-15 13:55:00) [3]2Val © (15.01.03 13:46)
либо вьюха по подзапросу ЮЮ © (15.01.03 03:28) - самое простое, ИМХО.
Val (2003-01-15 13:46:00) [4]о нюансе: варианты, на мой взгляд, либо найти/написать udf типа nvl/isnull, либо хп.
Fareader (2003-01-15 13:43:00) [5]А почему бы не "склеить" результаты этих двух запросов в хранимой процедуре?
Johnmen (2003-01-15 13:34:00) [6]>neXt © (14.01.03 18:26)
>...в Вашем примере есть один недостаток, а именно
>если в таблице T2 есть записи с датой отсутствующей в T1...
Ты был невнимателен. Я на этот нюанс намекнул.
>neXt © (14.01.03 18:44)
>ЮЮ © (15.01.03 03:28)
Можно сколько угодно приводить примеров (MSSQL, Oracle, DB2, Paradox, DBase .....), только вопрос поставлен конкретно для IB...:)
ЮЮ (2003-01-15 03:28:00) [7]в MSSQL (да и в Paradox под БДЕ) можно и проще:
select
dt, sum(sm)
from
(select dt, sm from T1
union
select dt, sm from T2) T1T2
group by dt
order by dt
neXt (2003-01-14 18:44:00) [8]Могу сказать как это сделать одним запросом на MSSQL2000, деталей диалекта в IB не знаю, так что может быть там такой вариант не прокатит.
select
td.d,
isnull(sum(T1.s), 0) + isnull(sum(T2.s), 0)
from
(select distinct d
from T1
union
select distinct d
from T2) td,
T1, T2
where td.d *= T1.d
and td.d *= T2.d
group by td.d
neXt (2003-01-14 18:26:00) [9]Johnmen ©, в Вашем примере есть один недостаток, а именно
если в таблице T2 есть записи с датой отсутствующей в T1, то суммы за эту дату не выведутся! Это потеря данных. Так что, Ваше утверждение "Все приведенные примеры неверны...:(" остаётся в силе....
:)
Johnmen (2003-01-14 17:44:00) [10]>bilkm
Все приведенные примеры неверны...:(
>Ops
SELECT
T1.d,
(SUM(T1.s)+(SELECT SUM(T2.s) FROM T2 WHERE T2.d=T1.d)) AS SSS
FROM T1
GROUP BY T1.d
Единственный нюанс - когда в T2 нет записей с соответствующей датой из T1. Тогда вторая сумма=null и т.д.
bilkm (2003-01-14 16:52:00) [11](Таблица 1) t1 join (Таблица 2) t2 on
(t1.поле_дата = t2.поле_дата) and (t1.поле_сума = t2.поле_сума)
вместо условия on
(t1.поле_дата = t2.поле_дата) and (t1.поле_сума = t2.поле_сума)
можна связать таблици по primary_key если такой имеется
bilkm (2003-01-14 16:40:00) [12]select
t1.поле_дата,
sum(t1.поле_сума) + sum(t2.поле_сума)
from (Таблица 1) t1 join (Таблица 2) t2 on
(t1.поле_дата = t2.поле_дата) and (t1.поле_сума = t2.поле_сума)
group by t1.поле_дата
stone (2003-01-14 16:36:00) [13]можно использовать union
Ops (2003-01-14 16:33:00) [14]Так хочется красив через SQL
Может через View это сделать???
1 во view их объеденить
2 в запросе просто просумировать???
still (2003-01-14 16:16:00) [15]проще всего - отдельно
сначала получить одну сумму, потом другую, потом сложить