【问题标题】:Multiple joins error in group by when I use SUM function当我使用 SUM 函数时,组中的多个连接错误
【发布时间】:2019-09-30 10:11:37
【问题描述】:

我收到此错误:

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.

他希望我将我的所有字段添加到 group by 但这是不正确的。

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]如何只使用一组?

【问题讨论】:

    标签: sql group-by sum


    【解决方案1】:

    如果要使用聚合函数,通常需要在 GROUP BY 子句中指定所有非聚合列(如 Location.Name)。否则,您无法在查询中返回它们。

    如果要返回非聚合字段并且还包含聚合,则需要使用窗口函数:

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

    如果您的 DBMS 支持它,它看起来像:

    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]
    

    这将让您返回详细信息行以及在每个 [Source Document ID] 组上计算的 SUM()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 1970-01-01
      相关资源
      最近更新 更多