【发布时间】: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 TSQL 和 SQL Exclude Field from GROUP BY in results but use in WHERE 发布的建议,但仍然没有提供想要的结果
【问题讨论】:
-
分组时,所有字段必须是 GROUP BY 子句的一部分或聚合的一部分。这是一个合乎逻辑的要求,没有办法绕过它。
标签: sql-server tsql merge sql-server-2012