但是,将 SUM() 与窗口函数一起使用时会出现错误,指出其他列需要 GROUP BY 子句



>我有一个查询,我需要对各种范围执行求和。在我的理解中,在聚合函数之后使用窗口函数允许我执行此窗口函数上的聚合,因此我不再需要为请求的每一列都有一个 GROUP BY 子句。但是,当我尝试执行以下场景时:

DECLARE @TypeAgg nvarchar(100)
SELECT 
c.MyCode AS Code,
...
-- Lots of other scalar column without aggregate function go here
(SUM (
        SELECT PriceTypeA + PriceTypeB + PriceTypeC FROM Orders
        WHERE PriceCode = c.MyCode 
) OVER (PARTITION BY CASE @TypeAgg WHEN N'Daily' THEN OrderDate WHEN N'Monthly' THEN MONTH(OrderDate)) AS PriceForFood
--Others similar sums go here
FROM CodesTable as c
-- Lots of joins go here
GROUP BY CASE @TypeAgg WHEN N'Daily' THEN c.OrderDate WHEN N'Monthly' THEN MONTH(c.OrderDate) 

我仍然收到错误:

列"c.MyCode"在选择列表中无效,因为它不是 包含在聚合函数或 GROUP BY 子句中。

为什么会这样,我该如何解决?

非常感谢

你有一堆"没有聚合函数的标量列",以及一堆聚合函数。那些"没有聚合函数的标量列"需要在 GROUP BY 子句中。

你没有做你的榜样正在做的事情。他们正在使用sum() over,这是一个窗口函数。您正在使用 sum(select... over(...)...) ,这是一个应用于窗口函数结果的聚合函数。两件完全不同的事情。


如果要使用 GROUP BY 子句

,则 SELECT 列列表中不是聚合函数参数的每一列都必须出现在 GROUP BY 子句中。

您在最外层的 SELECT 语句中使用了 GROUP BY 子句。因此,SELECT 列列表中的每个"没有聚合函数的标量列"也必须出现在 GROUP BY 子句中。(有一个例外,但SQL Server AFAIK不支持它。

相关内容

最新更新