当前位置: 代码迷 >> Sql Server >> 求个 行转列解决方法
  详细解决方案

求个 行转列解决方法

热度:20   发布时间:2016-04-24 20:23:25.0
求个 行转列
表中 有数据
mid  mvalue
1    1
2    1
3    1
1    2
2    2
3    2
1    3
2    3
3    3
1    4
2    4
3    4
........
求效果为
mid n1,n2,n3
1   1  2  3
2   1  2  3
3   1  2  3
4   1  2  3
........



------解决方案--------------------
----------------------------
-- Author  :fredrickhu(小F,向高手学习)
-- Date    :2013-09-24 15:30:18
-- Verstion:
--      Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
-- Feb 10 2012 19:39:15 
-- Copyright (c) Microsoft Corporation
-- Enterprise Edition: Core-based Licensing (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
--
----------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go 
create table [tb]([mid] int,[mvalue] int)
insert [tb]
select 1,1 union all
select 2,1 union all
select 3,1 union all
select 1,2 union all
select 2,2 union all
select 3,2 union all
select 1,3 union all
select 2,3 union all
select 3,3 union all
select 1,4 union all
select 2,4 union all
select 3,4
--------------开始查询--------------------------
SELECT 
mvalue,
MAX(CASE WHEN px=1 THEN mid END) AS n1,
MAX(CASE WHEN px=2 THEN mid END) AS n2,
MAX(CASE WHEN px=3 THEN mid END) AS n3
FROM
   (SELECT *, px=(SELECT COUNT(1)+1  FROM TB WHERE mvalue=t.mvalue AND mid<t.mid) FROM TB T)t
GROUP BY
   mvalue
----------------结果----------------------------
/* mvalue      n1          n2          n3
----------- ----------- ----------- -----------
1           1           2           3
2           1           2           3
3           1           2           3
4           1           2           3
警告: 聚合或其他 SET 操作消除了 Null 值。

(4 行受影响)
*/

------解决方案--------------------

WITH a1 (mid,mvalue) AS 
(
SELECT 1,1 UNION ALL
SELECT 2,1 UNION ALL
SELECT 3,1 UNION ALL
SELECT 1,2 UNION ALL
SELECT 2,2 UNION ALL
SELECT 3,2 UNION ALL
SELECT 1,3 UNION ALL
SELECT 2,3 UNION ALL
SELECT 3,3 UNION ALL
SELECT 1,4 UNION ALL
SELECT 2,4 UNION ALL
SELECT 3,4
)
SELECT mvalue AS mid,[1] AS n1,[2] AS n2,[3] AS n3
FROM a1
PIVOT (MAX(mid) FOR mid IN ([1],[2],[3])) b

------解决方案--------------------
2005+

SELECT 
mvalue,
MAX(CASE WHEN px=1 THEN mid END) AS n1,
MAX(CASE WHEN px=2 THEN mid END) AS n2,
MAX(CASE WHEN px=3 THEN mid END) AS n3
FROM
   (SELECT *, px=ROW_NUMBER() OVER(PARTITION BY mvalue ORDER BY mid) FROM TB )t
GROUP BY
   mvalue

------解决方案--------------------
  相关解决方案