| 
			
			 | 
		#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 | |||
		
  |