日期:2014-05-17  浏览次数:20562 次

行列转换
CREATE TABLE test
    (
      id INT ,
      NAME VARCHAR(20) ,
      dt DATETIME ,
      f1 VARCHAR(20) ,
      f2 VARCHAR(20)
    )
INSERT INTO test VALUES(1,'早上','20121115','at','dt')
INSERT INTO test VALUES(2,'中午','20121115','bz','tf')
INSERT INTO test VALUES(3,'早上','20121116','tf','8d')
INSERT INTO test VALUES(4,'中午','20121116','ef','tf')
INSERT INTO test VALUES(5,'早上','20121117','ad','dt')
INSERT INTO test VALUES(6,'中午','20121117','abc','3d')
INSERT INTO test VALUES(7,'早上','20121118','efg','dt')
INSERT INTO test VALUES(8,'中午','20121119','ut','rd')

SELECT * FROM test
id NAME dt f1 f2
1 早上 2012-11-15  at dt
2 中午 2012-11-15  bz tf
3 早上 2012-11-16 tf 8d
4 中午 2012-11-16  ef tf
5 早上 2012-11-17  ad dt
6 中午 2012-11-17  abc 3d
7 早上 2012-11-18 efg dt
8 中午 2012-11-19  ut rd
..................
即按name分组,按dt字段分将多行合并为多列(将dt字段按周合并即周一到周日),如何操作
如下图所示


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


SELECT 
NAME
,MAX(CASE WHEN DATEPART(weekday,dt)=1 THEN f1 ELSE '' END) AS 周一f1
,MAX(CASE WHEN DATEPART(weekday,dt)=1 THEN f2 ELSE '' END) AS 周一f1
,MAX(CASE WHEN DATEPART(weekday,dt)=2 THEN f1 ELSE '' END) AS 周二f1
,MAX(CASE WHEN DATEPART(weekday,dt)=2 THEN f2 ELSE '' END) AS 周二f2
,MAX(CASE WHEN DATEPART(weekday,dt)=3 THEN f1 ELSE '' END) AS 周三f1
,MAX(CASE WHEN DATEPART(weekday,dt)=3 THEN f2 ELSE '' END) AS 周三f2
,MAX(CASE WHEN DATEPART(weekday,dt)=4 THEN f1 ELSE '' END) AS 周四f1
,MAX(CASE WHEN DATEPART(weekday,dt)=4 THEN f2 ELSE '' END) AS 周四f2
,MAX(CASE WHEN DATEPART(weekday,dt)=5 THEN f1 ELSE '' END) AS 周五f1
,MAX(CASE WHEN DATEPART(weekday,dt)=5 THEN f2 ELSE '' END) AS 周五f2
,MAX(CASE WHEN DATEPART(weekday,dt)=6 THEN f1 ELSE '' END) AS 周六f1
,MAX(CASE WHEN DATEPART(weekday,dt)=6 THEN f2 ELSE '' END) AS 周六f2
,MAX(CASE WHEN DATEPART(weekday,dt)=7 THEN f1 ELSE '' END) AS 周日f1
,MAX(CASE WHEN DATEPART(weekday,dt)=7 THEN f2 ELSE '' END) AS 周日f2
FROM test
GROUP BY NAME
ORDER BY MIN(id) ASC