|
|
#1 |
|
Участник
|
Вопрос по Query с агрегатной функцией
Пытаюсь написать запрос типа:
Код: select SUM(IT.CostAmountPosted) from INVENTTRANS IT inner join InventDim InvDim ON InvDim.InventDimId = IT.InventDimId where (IT.DateFinancial >= '20060901') AND (IT.DateFinancial <= '20060930')AND (IT.StatusReceipt = 1) Query делал в таком вот виде: Код: qbd = queryExt.addDataSource(tableNum(InventTrans)); qbd.addSelectionField(fieldNum(InventTrans ,CostAmountPosted),SelectionField::Sum) ; qbd.addRange(fieldNum(InventTrans, DateFinancial)).value(SysQuery::range(bMth,eMth)); qbd.addRange(fieldNum(InventTrans, StatusReceipt)).value(Enum2Str(StatusReceipt::Purchased)); qbd.orderMode(OrderMode::GroupBy); qbd = queryExt.dataSourceTable(tableNum(InventTrans)).addDataSource(tableNum(InventDim)); qbd.addLink(fieldNum(InventTrans,InventDimId),fieldNum(InventDim,InventDimId)); qbd.joinMode(JoinMode::InnerJoin); qbd.fetchMode(QueryFetchMode::One2Many); qbd.addSortField(fieldNum(InventDim, InventDimId)); qbd.orderMode(OrderMode::GroupBy); |
|
|
|
|
#2 |
|
Участник
|
Честно говоря, не совсем понятно, зачем вы join-ите дополнительно InventDim, если она не учавствует никак в фильтрации или группировке.
Но решить вашу проблему можно очень просто. Добавить поле выбора на таблицу InventDim: вместо этого: X++: qbd.addLink(fieldNum(InventTrans,InventDimId),fieldNum(InventDim,InventDimId)); qbd.joinMode(JoinMode::InnerJoin); qbd.fetchMode(QueryFetchMode::One2Many); qbd.addSortField(fieldNum(InventDim, InventDimId)); qbd.orderMode(OrderMode::GroupBy); X++: qbd.relations(true); qbd.addSelectionField(fieldNum(InventDim, InventDimId), SelectionField::Max); |
|
|
|
|
#3 |
|
Участник
|
|
|
|
|
|
#4 |
|
Участник
|
Спасибо, помогает.
Просто меня интересовала сама специфика решения такого вопроса, запрос - прсто часть задачи, и на InventDim и фильтры накладываться будут и еще джойниться таблицы. А с помощью обычного select запрос такого типа реализуется? Что то типа: X++: select SUM(CostAmountPosted) from invTrans join invDim .... where ..... |
|
|
|
|
#5 |
|
Участник
|
Цитата:
Сообщение от Jarad
Спасибо, помогает.
Просто меня интересовала сама специфика решения такого вопроса, запрос - прсто часть задачи, и на InventDim и фильтры накладываться будут и еще джойниться таблицы. А с помощью обычного select запрос такого типа реализуется? Что то типа: X++: select SUM(CostAmountPosted) from invTrans join invDim .... where ..... Нельзя одновременно выбирать и агрегатные поля и обычные. Получите точно такую же ошибку: Код: InventTrans IT;
InventDim InvDim;
;
select SUM(CostAmountPosted)
from IT
join InvDim
where InvDim.InventDimId == IT.InventDimId &&
IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) && IT.StatusReceipt == 1; |
|
|
|
|
#6 |
|
Участник
|
|
|
|
|
|
#7 |
|
Участник
|
См. пост выше.
![]() |
|
|
|
|
#8 |
|
Участник
|
Попробовал реализовать запрос через выражение select
X++: select Sum(CostAmountPosted) from invTrans join maxof(InventDimId) from invDim where (invDim.inventDimId == invTrans.inventDimId) && (invTrans.DateFinancial >= bMth) && (invTrans.DateFinancial <= eMth) && (invTrans.StatusReceipt == StatusReceipt::Purchased); |
|
|
|
|
#9 |
|
Участник
|
Именно.
Это же на самом деле одно и то же, что и через QueryBuild* |
|
|
|
|
#10 |
|
Участник
|
Ну, вообще-то, можно еще exists join сделать
X++: select SUM(CostAmountPosted) from IT where IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) && IT.StatusReceipt == 1 exists join InvDim where InvDim.InventDimId == IT.InventDimId;
__________________
Axapta v.3.0 sp5 kr2 |
|
|
|
|
#11 |
|
Участник
|
Цитата:
Сообщение от kashperuk
Нет.
Нельзя одновременно выбирать и агрегатные поля и обычные. Получите точно такую же ошибку: Код: InventTrans IT;
InventDim InvDim;
;
select SUM(CostAmountPosted)
from IT
join InvDim
where InvDim.InventDimId == IT.InventDimId &&
IT.DateFinancial >= mkDate(1, 9, 2006) && IT.DateFinancial <= mkDate(30, 9, 2006) && IT.StatusReceipt == 1; Вот так напишите и будет вам счастье Код: select SUM(CostAmountPosted)
from IT
join tableId from InvDim
where InvDim.InventDimId == IT.InventDimId... |
|
|
|
|
#12 |
|
----------------
|
Еще можно добавлять группировку по полям, по которым идет фильтрация, например StatusIssue
|
|
|
|
|
Похожие темы
|
||||
| Тема | Ответов | |||
| Очередной вопрос про Query | 45 | |||
| Сортировка по полю с агрегатной функцией | 10 | |||
| Вопрос по query и join | 2 | |||
| Вопрос по запросу (query) | 2 | |||
| Вопрос знатокам QBE и Query в AXAPTA | 6 | |||
|