当前位置: 代码迷 >> Sql Server >> SQL 列转行解决思路
  详细解决方案

SQL 列转行解决思路

热度:101   发布时间:2016-04-24 09:55:17.0
SQL 列转行
我有个表:
A  B  C  D   a   b   c   d
--------------------------------
1  1   1   1   2   2   2   2         


想转换成:
序号   值1   值2
--------------------
1         1         2
2         1         2
3         1         2
4         1         2


用unpivot 函数,只会转换成一列,不知怎么操作啊?
------解决思路----------------------
WITH CTE AS(
SELECT 1 A,1 B,1 C,1 D, 2 a1, 2 b1, 2 c1,2 d1
)
SELECT [值1],[值2] FROM
(
SELECT
U.Z
,CASE WHEN U.X IN('A','B','C','D')THEN'值1' ELSE '值2' END[Y]
,CASE WHEN U.X IN('A','a1')THEN'A' WHEN U.X IN('B','b1')THEN'B' WHEN U.X IN('C','c1')THEN'C' WHEN U.X IN('D','d1')THEN'D' END[X]
FROM CTE UNPIVOT(Z FOR X IN(A,B,C,D,a1,b1,c1,d1))AS U
)
T PIVOT(SUM(T.Z)FOR T.Y IN([值1],[值2])) P
/*
1 2
1 2
1 2
1 2
*/
如#1所说,不过还进一步CASE,
另外,你的列名能区分大小写~~
你参考一下,具体问题具体处理
------解决思路----------------------
引用:
你这个和你的列子不一样啊。你列子里面前面4列都是1 后面4列都是2 这里面不是这样啊 没法按照我的方法分组 。

Quote: 引用:

回复 : alimake ,执行  SELECT * FROM MY_TABLE







引用:
你这个和你的列子不一样啊。你列子里面前面4列都是1 后面4列都是2 这里面不是这样啊 没法按照我的方法分组 。

Quote: 引用:

回复 : alimake ,执行  SELECT * FROM MY_TABLE









with  cte1 as 
(select qty, case when type like 'bms%' then 1 else 2 end as type
 from (select * from my_type unpivot 
(qty for type in (BMS_volt01,BMS_volt02,BMS_volt03,BMS_volt04,stp_volt01,stp_volt02,stp_volt03
,stp_volt04)) as p) as t)
select n,[1] as 值1,[2] as 值2 from (select qty,TYPE,
row_number()over(partition by type order by  type)as n from cte1 ) as t 
pivot (min(qty) for type in ([1],[2])) as p

  相关解决方案