28.10.2006, 14:34 | #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); |
|
28.10.2006, 16:29 | #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); |
|
28.10.2006, 17:27 | #3 |
Участник
|
|
|
30.10.2006, 12:31 | #4 |
Участник
|
Спасибо, помогает.
Просто меня интересовала сама специфика решения такого вопроса, запрос - прсто часть задачи, и на InventDim и фильтры накладываться будут и еще джойниться таблицы. А с помощью обычного select запрос такого типа реализуется? Что то типа: X++: select SUM(CostAmountPosted) from invTrans join invDim .... where ..... |
|
30.10.2006, 12:37 | #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; |
|
30.10.2006, 12:53 | #6 |
Участник
|
|
|
30.10.2006, 12:55 | #7 |
Участник
|
См. пост выше.
|
|
30.10.2006, 16:13 | #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); |
|
30.10.2006, 16:31 | #9 |
Участник
|
Именно.
Это же на самом деле одно и то же, что и через QueryBuild* |
|
30.10.2006, 16:49 | #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 |
|
31.10.2006, 19:35 | #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... |
|
31.10.2006, 21:10 | #12 |
----------------
|
Еще можно добавлять группировку по полям, по которым идет фильтрация, например StatusIssue
|
|
|
Похожие темы | ||||
Тема | Ответов | |||
Очередной вопрос про Query | 45 | |||
Сортировка по полю с агрегатной функцией | 10 | |||
Вопрос по query и join | 2 | |||
Вопрос по запросу (query) | 2 | |||
Вопрос знатокам QBE и Query в AXAPTA | 6 |
|