![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос SQL [D7, XP]
rosl © (2007-04-23 03:33:00)Уважаемые мастера, подскажите пожалуйста.
есть таблицы:
shet
id_key number_shet data_shet
1 1 01.01.2007
shet_link
cena shet_link
75 1
200 1
spisanie
summa shet_fakt
100 1
9,87 1
нужно сделать запрос, какая сумма по счёту и сколько списано:
делаю запрос:
select shet.NUMBER_SHET, shet.DATE_SHET, sum(lnk.CENA), sum(opl.SUMMA)
from SHETS shet, SHET_LINK lnk, SPISANIE opl
where lnk.LINK_SHET = shet.ID_KEY
and opl.SHET_FAKT = shet.ID_KEY
group by shet.NUMBER_SHET, shet.DATE_SHET
результат:
number_shet data_shet cena summa
1 01.01.2007 550 219.74
суммы задваиваются. нужно:
number_shet data_shet cena summa
1 01.01.2007 275 109,87
rosl (2007-04-23 15:03:00) [1]может воспользуюсь советом Sergey13 ©.
я просто создал два представления, а потом вытянул оттуда уже сгруппированные данные.
вложенные запросы пробовал делать (типа select ... (select...)), но IB ругался. Скорее всего неправильно что-то писал (учусь).
Всё равно, ОГРОМНОЕ спасибо за помощь.
Sergey13 (2007-04-23 11:55:00) [2]> [6] ЮЮ © (23.04.07 11:32)
Да действительно. Ни разу не сталкивался.
Тогда только так
select t1.id,
(select sum(t2.f2) from t2 where t2.id = t1.id) as Sum1,
(select sum(t3.f2) from t3 where t3.id = t1.id) as Sum2
from t1
ЮЮ (2007-04-23 11:32:00) [3]> [5] Sergey13 © (23.04.07 10:21)
Как ни связывай, если в ожной подчиненной таблице N записей, а во второй - M, при связи главной таблицы с двумя подчиненными получим M x N записей, т.е. сумма по первой таблице будет в M раз больше ожидаемой, а по второй - в N.
P.S. В принципе ожидаемое увеличение можно посчитать и разделить полученную сумму на него
Sergey13 (2007-04-23 10:21:00) [4]> [4] rosl (23.04.07 10:15)
Я не особо въехал в твою структуру. Возможно несколько ее видоизменив можно избавиться от ошибки (непонятной какой то).
В качестве шаманства можно попробовать связать по другому таблицы.
where lnk.LINK_SHET = shet.ID_KEY and opl.SHET_FAKT = lnk.LINK_SHET
rosl (2007-04-23 10:15:00) [5]разобрался - CREATE VIEW
rosl (2007-04-23 05:05:00) [6]компоненты доступа обыкновенные IBQuery1
rosl (2007-04-23 05:04:00) [7]в форме вопроса нет типа СУБД.
использую Ibase7.
если можно, то поподробнее про "агрегатные запросы надо делать отдельно к SHET_LINK и SPISANIE, а затем соединять в один набор". если несложно, к этим данным запрос.
я делал CREATE VIEW. может есть способ проще?
ЮЮ (2007-04-23 04:53:00) [8]в запросах главное не [D7, XP], а СУБД и компоненты доступа, т.к. в рамках элементарного и поддерживаемого всеми синтаксиса SQL задачу, ИМХО, не решить: агрегатные запросы надо делать отдельно к SHET_LINK и SPISANIE, а затем соединять в один набор