AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.02.2012, 10:49   #1  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
! Выборка сумм из двух таблиц
Есть простенький 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  
lev is offline
lev
Ищущий знания...
Аватар для lev
Oracle
MCBMSS
Axapta Retail User
 
1,723 / 491 (20) +++++++
Регистрация: 18.01.2005
Адрес: Москва
Правильно ли я понял, что необходимо одним запросом получить суммы по накладным (в разрезе накладных) и суммы строк по ним (наверное что бы сравнить)

если да, то я бы сделал так:
X++:
while select vendInvoiceJour
    group by InvoiceId, InvoiceDate, InvoiceAccount, InvoiceAmount // добавил дату и поставщика, т.к. у разных поставщиков может быть один номер накладной, в итоге сгруппируется не правильно
    join sum(LineAmount) from vendInvoiceTrans
    where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId
Мне кажется тут не нужен sum по шапкам накладных, а достаточно просто сгруппировать по суммам, т.к. мы все равно группируем в разрезе каждой накладной.
__________________
"Страх перед возможностью ошибки не должен отвращать нас от поисков истины." (с)
С Уважением,
Елизаров Артем
За это сообщение автора поблагодарили: S.Kuskov (2), propeller (1).
Старый 24.02.2012, 10:57   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,899 / 5689 (195) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Создать два view с суммами, группировкой по invoiceId, и суммой и invoiceId в списке полей. Потом из заджойнить. Можно даже еще одно view сделать поверх этих двух - чтобы пользователи его смогли напрямую в форме просматривать, без возни со временной таблицей...
P.S. Хотя по сути lev прав - бессмысленно сумировать vendInvoiceJour в разрезе invoiceId. Ну конечно если не хочется получить сумму всех накладных с одинаковым номером независимо от поставщика...
Старый 24.02.2012, 11:02   #4  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,432 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
в T-SQL такой запрос можно сделать с помощью UNION
А может проще не суммировать по полю InvoiceAmount а группировать по нему
X++:
while select vendInvoiceJour
    group by InvoiceId, InvoiceAmount
    join sum(LineAmount) from vendInvoiceTrans
    where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId ...
    {....
P.S.: К слову в AX2009 появилась возможность делать UNION, только для этого необходимо использовать Query.
Старый 24.02.2012, 11:06   #5  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Цитата:
Сообщение от lev Посмотреть сообщение
Правильно ли я понял, что необходимо одним запросом получить суммы по накладным (в разрезе накладных) и суммы строк по ним (наверное что бы сравнить)

Мне кажется тут не нужен sum по шапкам накладных, а достаточно просто сгруппировать по суммам, т.к. мы все равно группируем в разрезе каждой накладной.
не для сравнения))) на самом деле у меня другой запрос, это тут я упростил)
Интересное решение группировка по сумме, я что-то не догадался))). спасибо!
Старый 24.02.2012, 14:45   #6  
propeller is offline
propeller
Участник
Аватар для propeller
 
359 / 29 (1) +++
Регистрация: 25.07.2007
Эхх.. моя ошибка, неправильный я написал select.
C InvoiceId все просто.
а если так:
X++:
    while select sum(InvoiceAmount) from vendInvoiceJour
    group by InvoiceAccount
    join sum(LineAmount) from vendInvoiceTrans
    where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId
    { ....
Если использовать группировку по InvoiceAmount, то получается много строк по "счет на", а должна быть одна
Как тут быть?
Старый 24.02.2012, 14:49   #7  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,666 / 1172 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Не обязательно группировать по сумме накладной. Можно брать ее максимум или минимум.

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  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,666 / 1172 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от propeller Посмотреть сообщение
Эхх.. моя ошибка, неправильный я написал select.
C InvoiceId все просто.
а если так:
X++:
    while select sum(InvoiceAmount) from vendInvoiceJour
    group by InvoiceAccount
    join sum(LineAmount) from vendInvoiceTrans
    where vendInvoiceTrans.InvoiceId == vendInvoiceJour.InvoiceId
    { ....
Если использовать группировку по InvoiceAmount, то получается много строк по "счет на", а должна быть одна
Как тут быть?
Это и в "стандартном" SQL не получится. Сначала надо преобразовать связь много-ко-многим к виду много-к-одному или один-ко-многим. В идеале, один-к-одному. В "стандартном" SQL это делается через подзапросы. А в "стандарте" Axapta - через вложенные запросы.
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...
Старый 24.02.2012, 15:37   #9  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,432 / 1775 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Цитата:
Сообщение от propeller Посмотреть сообщение
не для сравнения))) на самом деле у меня другой запрос, это тут я упростил)
По теме Владимир Максимов уже ответил - нужно использовать вложенный подзапрос, ну или как предложил fed строить View.
Я же хочу спросить у вас для чего вы дважды считаете суммы и по строкам и по шапкам? Вы ожидаете увидеть там разные значения? Вы ищете ошибки в данных? Тогда группировка по InvoiceId совсем не лишняя.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Связь двух таблиц AngelDominantes DAX: Программирование 7 27.01.2012 18:53
DAX 4.0 Чем обусловлено наличие двух разных таблиц CustTable и VendTable? Бигудь DAX: Функционал 40 02.03.2009 13:04
Как получить записи двух таблиц в виде одной таблицы? chi DAX: Программирование 32 16.12.2004 11:44
Невидимая связь двух таблиц в формах ArturK DAX: Программирование 11 11.03.2004 18:18
Связь двух таблиц daemon DAX: Программирование 10 20.11.2003 16:32

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 15:07.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.