从行创建列

Creating columns from rows

我有这个table

ID      colname     F1        F2    F3       F4      
1       P1          1         2     3        4
1       P2          5         6     7        8
1       P3          9         10    11       12
1       P4          13        14    15       16
2       P1          17        18    19       20
2       P2          21        22    23       24
2       P3          25        26    27       28
2       P4          29        30    31       32

我正在尝试生成此结果 Pn 值对应于 Fn

 ID     P1        P2     P3       P4 
 1       1        6      11       16
 2       17       22     27       32

你能给我一些关于如何在 SQL 服务器中完成它的提示和关键词吗?

我一直在玩 Pivot,但它适合我吗?

你可以这样做:

select
     id,
     max(case when colname = 'P1' then F1 end) as P1,
     max(case when colname = 'P2' then F2 end) as P2,
     max(case when colname = 'P3' then F3 end) as P3,
     max(case when colname = 'P4' then F4 end) as P4
from Table1
group by id

sql fiddle demo

如果您想要一个使用 PIVOT 的解决方案:

SELECT *
FROM (
  SELECT ID,colname,value
  FROM MyTable
  UNPIVOT (value FOR col in ([F1],[F2],[F3],[F4])) a
  WHERE REPLACE(col,'F','P') = colname
) b
PIVOT (MAX(value) FOR colname in ([P1],[P2],[P3],[P4])) c

UNPIVOT followed PIVOT 方法对于转换非常通用,但通常像 Roman 的示例那样手动执行它更容易和更具可读性。