我有一个查询,我需要在各种范围内执行求和。根据我的理解,在聚合函数之后使用窗口函数允许我执行 这个窗口函数的聚合,我不再需要为我的请求的每一列都有一个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子句中。
为什么会这样,我该如何解决?
非常感谢
答案 0 :(得分:1)
你有一堆没有聚合函数"的标量列,以及一堆聚合函数。那些没有聚合函数的标量列"需要在GROUP BY子句中。
你没有做你的榜样。他们正在使用sum() over
,这是一个窗口函数。您正在使用sum(select... over(...)...)
,这是一个应用于窗口函数结果的聚合函数。两件完全不同的事情。
如果您要使用GROUP BY子句,SELECT列列表中不是聚合函数参数的每一列都必须出现在GROUP BY子句中。
您在最外层的SELECT语句中使用GROUP BY子句。所以每个标量列都没有聚合函数"在SELECT列列表中也必须出现在GROUP BY子句中。 (这是一个例外,但SQL Server AFAIK不支持它。)