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

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

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]

проще всего - отдельно
сначала получить одну сумму, потом другую, потом сложить


Наверх

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