Sql server 使用'将行转换为列;枢轴';前五名

Sql server 使用'将行转换为列;枢轴';前五名,sql-server,pivot-table,Sql Server,Pivot Table,我想要一个来自SQL表的数据透视表,其中包含前3条记录,并且只包含基于用户的过滤器 ID PrOjID User piD ------- ---- ------ ------ 1 Prj1 ABC 1 2 Prj2 XYZ 2 3 Prj3 ABC 3 4 Prj4 AB

我想要一个来自SQL表的数据透视表,其中包含前3条记录,并且只包含基于用户的过滤器

ID         PrOjID     User       piD
-------    ----     ------      ------
1          Prj1       ABC         1
2          Prj2       XYZ         2
3          Prj3       ABC         3
4          Prj4       ABC         4
5          Prj5       PQR         5
6          Prj1       XYZ         1
7          Prj3       PQR         3
8          Prj8       ABC         8
9          Prj1       PQR         1
10         Prj10      ABC         10
11         Prj11      ABC         11
12         Prj12      ABC         12
当用户是ABC时我想要的结果

ID1  PROJID1  piD1  ID2  PROJID2  piD2  ID3  PROJID3  piD3  
1    prj1     1     3    PRJ3     3     4    prj4     4
如果用户是xyz

ID1  PROJID1  piD1  ID2  PROJID2  piD2  ID3  PROJID3  piD3  
2    prj2     2     1    PRJ1     1     null  null    null

我们可以在
行编号的帮助下使用枢轴来处理此问题:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY piD) rn
    FROM yourTable
)

SELECT
    [User],
    MAX(CASE WHEN rn = 1 THEN ID END) AS ID1,
    MAX(CASE WHEN rn = 1 THEN PrOjID END) AS PROJID1,
    MAX(CASE WHEN rn = 1 THEN piD END) AS piD1,
    MAX(CASE WHEN rn = 2 THEN ID END) AS ID2,
    MAX(CASE WHEN rn = 2 THEN PrOjID END) AS PROJID2,
    MAX(CASE WHEN rn = 2 THEN piD END) AS piD2,
    MAX(CASE WHEN rn = 3 THEN ID END) AS ID3,
    MAX(CASE WHEN rn = 3 THEN PrOjID END) AS PROJID3,
    MAX(CASE WHEN rn = 3 THEN piD END) AS piD3
FROM cte
WHERE
    [User] = 'ABC'
GROUP BY
    [User];