24.02.2012, 10:49 | #1 |
Участник
|
Выборка сумм из двух таблиц
Есть простенький select:
X++: while select sum(InvoiceAmount) from vendInvoiceJour group by InvoiceId join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId ... {.... При выводе будем получать корректный LineAmount, но InvoiceAmount будет во столько раз больше, сколько строк в накладной, ну вы поняли=) Можно ли как-то одним select по этим двум таблицам получить корректные суммы? (в T-SQL такой запрос можно сделать с помощью UNION) |
|
24.02.2012, 10:57 | #2 |
Ищущий знания...
|
Правильно ли я понял, что необходимо одним запросом получить суммы по накладным (в разрезе накладных) и суммы строк по ним (наверное что бы сравнить)
если да, то я бы сделал так: X++: while select vendInvoiceJour group by InvoiceId, InvoiceDate, InvoiceAccount, InvoiceAmount // добавил дату и поставщика, т.к. у разных поставщиков может быть один номер накладной, в итоге сгруппируется не правильно join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с) С Уважением, Елизаров Артем |
|
|
За это сообщение автора поблагодарили: S.Kuskov (2), propeller (1). |
24.02.2012, 10:57 | #3 |
Moderator
|
Создать два view с суммами, группировкой по invoiceId, и суммой и invoiceId в списке полей. Потом из заджойнить. Можно даже еще одно view сделать поверх этих двух - чтобы пользователи его смогли напрямую в форме просматривать, без возни со временной таблицей...
P.S. Хотя по сути lev прав - бессмысленно сумировать vendInvoiceJour в разрезе invoiceId. Ну конечно если не хочется получить сумму всех накладных с одинаковым номером независимо от поставщика... |
|
24.02.2012, 11:02 | #4 |
Участник
|
А может проще не суммировать по полю InvoiceAmount а группировать по нему
X++: while select vendInvoiceJour group by InvoiceId, InvoiceAmount join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId ... {.... |
|
24.02.2012, 11:06 | #5 |
Участник
|
Цитата:
Сообщение от lev
Правильно ли я понял, что необходимо одним запросом получить суммы по накладным (в разрезе накладных) и суммы строк по ним (наверное что бы сравнить)
Мне кажется тут не нужен sum по шапкам накладных, а достаточно просто сгруппировать по суммам, т.к. мы все равно группируем в разрезе каждой накладной. Интересное решение группировка по сумме, я что-то не догадался))). спасибо! |
|
24.02.2012, 14:45 | #6 |
Участник
|
Эхх.. моя ошибка, неправильный я написал select.
C InvoiceId все просто. а если так: X++: while select sum(InvoiceAmount) from vendInvoiceJour group by InvoiceAccount join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId { .... Как тут быть? |
|
24.02.2012, 14:49 | #7 |
Участник
|
Не обязательно группировать по сумме накладной. Можно брать ее максимум или минимум.
X++: while select maxOf(InvoiceAmount) from vendInvoiceJour group by InvoiceId join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId ... {....
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
24.02.2012, 15:01 | #8 |
Участник
|
Цитата:
Сообщение от propeller
Эхх.. моя ошибка, неправильный я написал select.
C InvoiceId все просто. а если так: X++: while select sum(InvoiceAmount) from vendInvoiceJour group by InvoiceAccount join sum(LineAmount) from vendInvoiceTrans where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId { .... Как тут быть?
__________________
- Может, я как-то неправильно живу?! - Отчего же? Правильно. Только зря... |
|
24.02.2012, 15:37 | #9 |
Участник
|
Цитата:
Я же хочу спросить у вас для чего вы дважды считаете суммы и по строкам и по шапкам? Вы ожидаете увидеть там разные значения? Вы ищете ошибки в данных? Тогда группировка по InvoiceId совсем не лишняя. |
|