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

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 02.04.2008, 15:56   #1  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Суммы по двум таблицам
Всем привет!
Есть задача посчитать суммы в двух связанных(1:n) таблицах сгруппировав их по полю.
такой запрос приводит к неправильному результату, т.е. суммы в первой таблице считаются несколько раз (сколько записей во второй):
X++:
while select sum(LineAmount) from Table1 
	group by Table1.ItemId
	join sum(Qty), sum(CostAmount) from Table2 
		where Table1.Id = Table2.Id
как правильно можно посчитать одним запросом?
Старый 02.04.2008, 16:17   #2  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
По-моему, никак. Делайте вложенными циклами...
__________________
Zhirenkov Vitaly
Старый 03.04.2008, 11:39   #3  
raz is offline
raz
NavAx
Аватар для raz
NavAx Club
Лучший по профессии 2014
Лучший по профессии 2009
 
1,494 / 1065 (38) ++++++++
Регистрация: 22.07.2003
Адрес: МО
X++:
static void JobTest(Args _args)
{
    InventTrans         InventTrans;
    InventJournalTrans  InventJournalTrans;
    ;
    select sum(Qty), count(RecId) from InventTrans group by TransRefId
    join sum(Qty), sum(CostAmount) from InventJournalTrans
    where InventJournalTrans.InventTransId == InventTrans.InventTransId
       && InventJournalTrans.JournalId     == "СЖ00546541";

    info(strfmt("%1   %2   %3    %4",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.CostAmount));
}
Результат:
-9 720,00 2 -9 720,00 -57 639,60
Старый 03.04.2008, 12:09   #4  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
2 raz: Извини, но пример "ни о чём" в контексте имеющегося вопроса.
В приведённом примере связь похоже 1 к 1-му. А нужно 1 ко многим. И группировка должна быть на "таблице-шапке".

Вот пример raz, не работающий на правильных данных и мой вариант решения исходной задачи:
X++:
static void ZVVJobTest(Args _args)
{
    InventTrans         InventTrans;
    InventJournalTrans  InventJournalTrans, InventJournalTransIn;
    ;

    // Журнал "УЗЖ001779"
    // В нём одна строка с кол-вом 10 (цена 20, сумма 200)
    // По ней 2 проводки с кол-вом 5 в каждой

    select sum(Qty), count(RecId) from InventTrans group by TransRefId
    join sum(Qty), sum(CostAmount), count(RecId) from InventJournalTrans
    where InventJournalTrans.InventTransId == InventTrans.InventTransId
       && InventJournalTrans.JournalId     == "УЗЖ001779";

    info(strfmt("Неверно! Проводка: %1   %2   Строка: %3    %4   %5",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.RecId, InventJournalTrans.CostAmount));

    while Select sum(Qty), sum(CostAmount), count(RecId) from InventJournalTrans
        group by ItemId
        where InventJournalTrans.JournalId     == "УЗЖ001779"
    {

        // Второй Джоин строк журнала для демонстрации общего случая, когда нет группируемого поля во второй таблице
        //  (возможно в некотрых случаях по смыслу он и не нужен!)
        select sum(Qty), count(RecId) from InventTrans
           join count(recid) from InventJournalTransIn
            where InventJournalTransIn.InventTransId    == InventTrans.InventTransId
               && InventJournalTransIn.JournalId     == "УЗЖ001779"
               && InventJournalTransIn.ItemId           == InventJournalTrans.ItemId;

        info(strfmt("Верно! Проводка: %1   %2   Строка: %3    %4   %5",InventTrans.Qty, InventTrans.RecId, InventJournalTrans.Qty, InventJournalTrans.RecId, InventJournalTrans.CostAmount));
    }
}
Результат:
Неверно! Проводка: 10,00 2 Строка: 20,00 2 400,00
Верно! Проводка: 10,00 2 Строка: 10,00 1 200,00
__________________
Zhirenkov Vitaly

Последний раз редактировалось ZVV; 03.04.2008 в 12:13. Причина: Сорри, ошибка закралась в коде :)
Старый 03.04.2008, 14:50   #5  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
к сожалению исходная задача вложенными запросами не решается, тк запрос создается динамически, приведенный мной пример лишь частный случай, сам запрос можетбыть гораздо сложней (множество группировок, джойнов, фильтров)
Старый 03.04.2008, 16:37   #6  
ZVV is offline
ZVV
MCITP
MCP
Oracle
MCBMSS
 
1,006 / 246 (11) ++++++
Регистрация: 13.02.2004
Адрес: Минск
->
Ну боюсь, что тем не менее придётся что-то менять в вашей динамике.
В аксапте одним запросом вы такое не сможете изобразить. По крайней мере, мне в голову ничего не приходит.
В оракле ещё можно было бы через аналитические функции выкрутиться, но и то, это получится такой навороченный и нечитаемый селект в вашем случае "(множество группировок, джойнов, фильтров) "...
__________________
Zhirenkov Vitaly
Старый 09.04.2008, 13:01   #7  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от ice Посмотреть сообщение
Всем привет!
... как правильно можно посчитать одним запросом?
Если в аксапте, то только через вьюху со своими плюсами и минусами...
Старый 09.04.2008, 13:10   #8  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от vallys Посмотреть сообщение
Если в аксапте, то только через вьюху со своими плюсами и минусами...
вьюха не поддерживает более одного джойна к таблице
Старый 09.04.2008, 14:23   #9  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от ice Посмотреть сообщение
вьюха не поддерживает более одного джойна к таблице
Не понял.
Я имел в виду что запрос вида
Код:
select ... 
from Table1, (select id, ... from Table2 group by id) as Table2
where Table1.id = Tablt2.id
[group by ...]
в аксапте одним запросом можно реализовать только с помощью вьюхи, которая будет представлять собой подзапрос с группировкой.
Вот только на практике зачастую это лишнее...
Старый 09.04.2008, 14:32   #10  
MironovI is offline
MironovI
Участник
 
724 / 77 (4) ++++
Регистрация: 30.05.2005
Цитата:
Сообщение от vallys Посмотреть сообщение
в аксапте одним запросом можно реализовать только с помощью вьюхи, которая будет представлять собой подзапрос с группировкой.
Вот только на практике зачастую это лишнее...
В стандартных вьюхах нет параметра OrderMode насколько я помню
Старый 09.04.2008, 14:43   #11  
vallys is offline
vallys
Developer
 
146 / 108 (0) +++++
Регистрация: 18.01.2005
Цитата:
Сообщение от MironovI Посмотреть сообщение
В стандартных вьюхах нет параметра OrderMode насколько я помню
За-то есть свойство Aggregation у полей вьюхи
Старый 10.04.2008, 11:58   #12  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Всем большое спасибо за участие!
Проблему решил с использованием временной таблицы
Старый 10.04.2008, 14:42   #13  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
зачем временная таблица? лучше используйте класс KeySum
__________________
полезное на axForum, github, vk, coub.
Старый 10.04.2008, 15:21   #14  
ice is offline
ice
Участник
Аватар для ice
Лучший по профессии 2014
 
1,731 / 406 (17) +++++++
Регистрация: 23.03.2006
Цитата:
Сообщение от mazzy Посмотреть сообщение
зачем временная таблица? лучше используйте класс KeySum
отчет очень сложный, и временная таблица уже использовалась для хранения собранных данных, просто добавил в ней количество записей
Старый 25.04.2008, 12:59   #15  
polygris is offline
polygris
Участник
AxAssist
MCBMSS
 
272 / 67 (3) ++++
Регистрация: 14.06.2005
Адрес: Киев
а что собственно делает класс KeySum?
Старый 28.04.2008, 15:53   #16  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,691 / 1195 (43) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Цитата:
Сообщение от polygris Посмотреть сообщение
а что собственно делает класс KeySum?
Сохраняет и модифицирует набор чисел, позволяя обращаться к каждому из них по "ключу". Т.е. не просто по номеру (как в массиве), но по некоему идентификатору. Как правило, символьному, но тип идентификатора может быть любым. В частности, и числом.

При этом, имеется возможность (при желании) упорядочивать элементы набора по значению ключа, а также подсчитывать итоговую сумму всех числовых данных.

Также можно организовать хранение "многомерных" чисел. Т.е. каждое "число" может представляться контейнером из набора чисел.

Основной метод inventSum.updateNow() прибавляет к указанному элементу указанное значение.

Используется для хранения промежуточных результатов расчета и "накопительных" значений. В смысле суммы, получающейся в результате прогона некоего цикла, где сумма увеличивается на значение, вычисляемое в теле цикла.
За это сообщение автора поблагодарили: Qaz Qwerty (1).
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Расхождение суммы проводки по поставщику и сопоставленной суммы petr DAX: Функционал 2 15.10.2008 23:31
Алгоритм расчета общей суммы kashperuk DAX: Программирование 31 05.09.2007 22:37
Запрос по двум таблицам fialka DAX: Программирование 17 15.12.2006 14:36
Корректировка суммы налога в закупке ymv2000 DAX: Функционал 4 26.10.2006 09:19
Группировка по двум и более таблицам rrkrivov DAX: Программирование 2 27.12.2004 07:29

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

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

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:18.