sql - 将不同的行属性转置/旋转为列并将另一个属性分组?

标签 sql sql-server pivot

这个问题在这里已经有了答案:




8年前关闭。




Possible Duplicate:
SQL Server dynamic PIVOT query?



是否可以对下表执行查询:
Game    Player  Goals
-----   ------  ------
Game1   John    1
Game1   Paul    0
Game1   Mark    2
Game1   Luke    1
Game2   John    3
Game2   Paul    1   
Game2   Luke    1
Game3   John    0
Game3   Mark    2

这给出了这样的结果:
Game    John    Paul    Mark    Luke
-----   ----    ----    ----    ----
Game1   1       0       2       1
Game2   3       1       -       1
Game3   0       -       2       -

它将每个不同的玩家变成一个列,并对游戏进行分组,给出每个玩家每场比赛的目标。

最佳答案

您可以使用 PIVOT功能。如果您有已知数量的列,则可以对这些值进行硬编码:

select *
from
(
  select game, player, goals
  from yourtable
) src
pivot
(
  sum(goals)
  for player in ([John], [Paul], [Mark], [Luke])
) piv
order by game

SQL Fiddle with Demo

如果您有未知数量的列,那么您可以使用动态 sql:
DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(player) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT game, ' + @cols + ' from 
             (
                select game, player, goals
                from yourtable
            ) x
            pivot 
            (
                sum(goals)
                for player in (' + @cols + ')
            ) p '

execute(@query)

SQL Fiddle with Demo

关于sql - 将不同的行属性转置/旋转为列并将另一个属性分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13188158/

相关文章:

python - 如何改进 python 中的快速排序枢轴选择?

mysql - INT 列值乱序超过 10 个字符

sql-server - 将 with cte 查询的结果插入临时表

sql - 在 CASE THEN 内选择

c# - 为什么通过 ADO.NET 执行的存储过程花费的时间比 SQL Server Management Studio 长很多倍?

sql - postgres - 使用数组值进行透视查询

php - 获取 'pivot'表中的所有字段

SQL:如何更新 ltree 中的值?

sql - 使用用户输入的日期从表单更新表格

sql - 已提交读隔离级别是否会导致死锁(Sql Server)?