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

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

запрос 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, а затем соединять в один набор


Наверх

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