sql-server - 同一列上具有多个聚合的 T-SQL Pivot

标签 sql-server tsql

这似乎应该是一个常见的需求,但我不知道如何使用 T-SQL PIVOT 函数来做到这一点。具体来说,我想计算数据透视列值上的列的 AVG 和 STDEV。数据看起来像这样(省略了很多数据,但这触及核心):

--------------------------------------------------------------------------
ID           Year     PersonID     Score 
--------------------------------------------------------------------------
106          2001        1          20
107          2002        1          30       
108          2003        1          40       
109          2004        1          50     
106          2002        2          20
107          2003        2          50       
108          2004        2          30       
109          2005        2          10   
--------------------------------------------------------------------------

我想看到以下输出

--------------------------------------------------------------------------
NonPivotCol1 NonPivotCol2  2001_Mean   2001_Avg  2002_Mean  2002_Avg  Etc 
--------------------------------------------------------------------------
Some Value   Some Value       32          5.2       28          3.1 
Etc. 
--------------------------------------------------------------------------

我需要恢复到旧的 CASE 语句逻辑吗?

谢谢!

最佳答案

是的。

只需使用旧式CASE 语法即可。

SELECT AVG(CASE WHEN Year = 2001 THEN Score END) AS 2001_Avg,
       STDEV(CASE WHEN Year = 2001 THEN Score END) AS 2001_StDev /*...*/

PIVOT 无论如何只是(不太通用的)语法糖。

Oracle supports multiple aggregatesPIVOT 中,但 TSQL 没有。

关于sql-server - 同一列上具有多个聚合的 T-SQL Pivot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18176138/

相关文章:

sql-server - Linux MS SQL Server 评估已过​​期,无法升级为开发人员

SQL 查询每隔几天就会变慢

sql-server - 表重命名后的外键约束

tsql - 以表值作为参数执行存储过程

SQL Server CTE 循环;将所有记录插入在一起

c# - 如何使用 App.config 连接 C# 和 Db?

sql - 表上的索引策略

sql - 从日期时间获取时间间隔

SQL Server 乐观锁定 - 返回更改的时间戳值

sql - SQL中是否存在 "LIKE"和 "IN"的组合?