从行创建列

时间:2015-04-16 16:40:39

标签: sql sql-server sql-server-2012 pivot

我有这张桌子

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 Server中完成的提示和关键词吗?

我一直在和Pivot玩,但这是要走的路吗?

2 个答案:

答案 0 :(得分:3)

你可以这样做:

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

答案 1 :(得分:1)

如果您想要使用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跟随PIVOT方法对于变换非常通用,但与罗马的示例一样,手动操作通常更容易,更易读。