【问题标题】:Aggregated Function with LAST_VALUE using CASE Statement and GROUP BY clause使用 CASE 语句和 GROUP BY 子句的 LAST_VALUE 聚合函数
【发布时间】:2019-02-16 04:24:32
【问题描述】:

我正在使用MERGE 语句,在SELECT 查询中我正在尝试在CASE 语句中使用LAST_VALUE 函数,该语句具有不同的汇总类型(例如SUM、AVG 等)和聚合函数.我想从GROUP BY 子句中排除[Value][Target][Budget] 字段。我正在使用OVER ORDER BY 语法,但不断收到以下错误:

消息 8120,第 16 级,状态 1,第 12 行
列“@TempFact_KPI.Value”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。

代码:

CREATE TYPE [dbo].[TempFact_KPI] AS TABLE(
[PeriodKey] [uniqueidentifier] NULL,
[KPIKey] [uniqueidentifier] NULL,
[SummaryType] [nvarchar](50) NULL,
[PeriodDateTime] [datetime] NULL,
[Value] [real] NULL,
[Target] [real] NULL,
[Budget] [real] NULL
)
GO

存储过程:

SELECT DISTINCT
    [PeriodKey],
    [KPIKey],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Value])
       WHEN 'Count' THEN COUNT([Value])
       WHEN 'Mean' THEN AVG([Value])
       WHEN 'Maximum' THEN MAX([Value])
       WHEN 'Minimum' THEN MIN([Value])
       WHEN 'Last' THEN LAST_VALUE([Value]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Value]
    END as [Value],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Target])
       WHEN 'Count' THEN COUNT([Target])
       WHEN 'Mean' THEN AVG([Target])
       WHEN 'Maximum' THEN MAX([Target])
       WHEN 'Minimum' THEN MIN([Target])
       WHEN 'Last' THEN LAST_VALUE([Target]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Target]
    END AS [Target],
    CASE [SummaryType]
       WHEN 'Sum' THEN SUM([Budget])
       WHEN 'Count' THEN COUNT([Budget])
       WHEN 'Mean' THEN AVG([Budget])
       WHEN 'Maximum' THEN MAX([Budget])
       WHEN 'Minimum' THEN MIN([Budget])
       WHEN 'Last' THEN LAST_VALUE([Budget]) OVER (ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
       ELSE [Budget]
    END AS [Budget] 
FROM 
    @TempFact_KPI
GROUP BY 
    [PeriodKey], [KPIKey], [SummaryType]

我查看了 Query for Min, Max, Avg, and Last Value in TSQLSQL Exclude Field from GROUP BY in results but use in WHERE 发布的建议,但仍然没有提供想要的结果

【问题讨论】:

  • 分组时,所有字段必须是 GROUP BY 子句的一部分或聚合的一部分。这是一个合乎逻辑的要求,没有办法绕过它。

标签: sql-server tsql merge sql-server-2012


【解决方案1】:

您可以使用窗口函数:

SELECT DISTINCT
[PeriodKey]
,[KPIKey]
,CASE [SummaryType]
    WHEN 'Sum'     THEN SUM([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Count'   THEN COUNT([Value]) OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Mean'    THEN AVG([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Maximum' THEN MAX([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Minimum' THEN MIN([Value])   OVER(PARTITION BY [PeriodKey], [KPIKey], [SummaryType])
    WHEN 'Last'    THEN LAST_VALUE([Value]) OVER (PARTITION BY [PeriodKey], [KPIKey], [SummaryType] ORDER BY [PeriodDateTime] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
    ELSE [Value]
END as [Value]
 -- ...
FROM @TempFact_KPI;

【讨论】:

  • 这与在 OPs 查询中的 GROUP by 子句中添加 [Value]、[Target] 和 [Budget] 效果不一样吗?
  • 仍有错误 列“@TempFact_KPI.PeriodKey”在选择列表中无效,因为它既不包含在聚合函数中,也不包含在 GROUP BY 子句中。
  • 如果我添加 GROUP BY [PeriodKey]、[KPIKey]、[SummaryType],我仍然收到我提到的相同错误“列 '@TempFact_KPI.Value' 在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中。"
  • @WayneHollier 窗口函数的全部点是不会有任何 GROUP BY。请在FROM @TempFact_KPI;查询结束后仔细阅读。
  • 感谢您的帮助。
猜你喜欢
  • 2019-10-23
  • 2010-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
  • 2012-12-07
相关资源
最近更新 更多