带有“绑定”的SQL Server数据透视表

时间:2014-03-30 19:17:50

标签: sql sql-server sql-server-2008

这是我的源数据:

+-------+-------+-------+------+
| Categ | Nm    | Value | Rnk  |
+-------+-------+-------+------+
| A     | Tom   |    37 |    1 |
| A     | Joe   |    36 |    2 |
| A     | Eddie |    35 |    3 |
| B     | Seth  |    28 |    1 |
| B     | Ed    |    25 |    2 |
| B     | Billy |    22 |    3 |
| C     | Julie |    42 |    1 |
| C     | Jenny |    41 |    2 |
| C     | April |    40 |    3 |
| C     | Mary  |    40 |    3 |
| C     | Laura |    40 |    3 |
+-------+-------+-------+------+

这是我想要产生的输出:

+------+--------+--------+-------+
| Rnk  |   A    |   B    |   C   |
+------+--------+--------+-------+
|    1 | Tom    | Seth   | Julie |
|    2 | Joe    | Ed     | Jenny |
|    3 | Eddie  | Billy  | April |
|    3 | (null) | (null) | Mary  |
|    3 | (null) | (null) | Laura |
+------+--------+--------+-------+

我使用了以下方法(我通过其他帖子理解可能优于实际使用PIVOT)...这让我到了Julie / Jenny / April,但不是Mary / Laura(显然,从那以后它是在“平局”的情况下拉动MIN。

SELECT Rnk
, min(CASE WHEN Categ = 'A' THEN Nm END) as A
, min(CASE WHEN Categ = 'B' THEN Nm END) as B
, min(CASE WHEN Categ = 'C' THEN Nm END) as C
FROM Tbl
GROUP BY Rnk

如何获得我想要的输出?

1 个答案:

答案 0 :(得分:3)

好吧,如果你想为每个等级多行,你不能按等级聚合,或至少按等级聚合。因此,计算排名中的排名,或者按照以下查询调用排名,sub_rnk

SELECT Rnk,
       min(CASE WHEN Categ = 'A' THEN Nm END) as A,
       min(CASE WHEN Categ = 'B' THEN Nm END) as B,
       min(CASE WHEN Categ = 'C' THEN Nm END) as C
FROM (select t.*, row_number() over (partition by categ, rnk order by newid()) as sub_rnk
      from Tbl t
     ) t
GROUP BY rnk, sub_rnk
ORDER BY rnk;