Ошибка множественных объединений в группе при использовании функции SUM - PullRequest
1 голос
/ 30 сентября 2019

Я получаю эту ошибку:

Column 'MDR.dbo.nav_BG$Location.Name' is invalid in the select list because 
it is not contained in either an aggregate function or the GROUP BY clause.

Он хочет, чтобы я добавил все мои поля в группу, но это неверно.

DECLARE @date datetime2 = CURRENT_TIMESTAMP;
SELECT   
[Source Document ID]        AS Source
,Location.Name              AS Address
,[Item No_]                 AS No
,[Document No_]             AS Document
,Item.[No_ 2]               AS No2
,MN.Name                    AS Brand
,SUM([Quantity Requested])  AS Qty,
CASE WHEN qty > 20 THEN  'No' ELSE 'Yes'  END AS Priority
,[Created On]               AS Date


FROM [MDR].[dbo].[nav_BG$AWHM_Document_Line] AS DocLine
JOIN [MDR].[dbo].[nav_BG$Item] AS Item ON DocLine.[Item No_] = Item.[No_]
JOIN [MDR].[dbo].[nav_BG$Location] AS Location ON DocLine.[Source Document ID] = Location.Code
JOIN [MDR].[dbo].[nav_BG$Manufacturer] AS MN ON Item.[Manufacturer Code] = MN.Code

WHERE [Location Code] = 'XXX'
AND   [Document Type] = 'XXX'
AND   [From Zone Code] = 'XXX'
AND   (DATEPART(yy, [Created On]) = YEAR(@date)
AND    DATEPART(mm, [Created On]) = MONTH(@date)
AND    DATEPART(dd, [Created On]) = DAY(@date))
GROUP BY [Source Document ID]
ORDER BY [Created On]

Ожидаемый результат будетSUM([Quantity Requested]) group by [Source Document ID].

Как использовать только одну группу по [Source Document ID]?

1 Ответ

0 голосов
/ 30 сентября 2019

Если вы собираетесь использовать статистическую функцию, вам обычно нужно указывать все неагрегированные столбцы (например, Location.Name) в предложении GROUP BY. В противном случае вы не сможете вернуть их в своем запросе.

Если вы хотите вернуть неагрегированные поля, а также включить агрегат, вам нужно использовать оконную функцию:

SUM([Quantity Requested]) OVER(PARTITION BY [Source Document ID])

Если ваша СУБД поддерживает это,это будет выглядеть следующим образом:

SELECT   
[Source Document ID]        AS Source
,Location.Name              AS Address
,[Item No_]                 AS No
,[Document No_]             AS Document
,Item.[No_ 2]               AS No2
,MN.Name                    AS Brand
,SUM([Quantity Requested]) OVER(PARTITION BY [Source Document ID])  AS Qty,
CASE WHEN qty > 20 THEN  'No' ELSE 'Yes'  END AS Priority
,[Created On]               AS Date

FROM [MDR].[dbo].[nav_BG$AWHM_Document_Line] AS DocLine
JOIN [MDR].[dbo].[nav_BG$Item] AS Item ON DocLine.[Item No_] = Item.[No_]
JOIN [MDR].[dbo].[nav_BG$Location] AS Location ON DocLine.[Source Document ID] = Location.Code
JOIN [MDR].[dbo].[nav_BG$Manufacturer] AS MN ON Item.[Manufacturer Code] = MN.Code

WHERE [Location Code] = 'XXX'
AND   [Document Type] = 'XXX'
AND   [From Zone Code] = 'XXX'
AND   (DATEPART(yy, [Created On]) = YEAR(@date)
AND    DATEPART(mm, [Created On]) = MONTH(@date)
AND    DATEPART(dd, [Created On]) = DAY(@date))
-- GROUP BY [Source Document ID]
ORDER BY [Created On]

Это позволит вам вернуть строки подробностей вместе с SUM(), рассчитанным для каждой группы [Source Document ID].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...