sqlsever 多列变成多行

http://www.cnblogs.com/seapub/archive/2012/11/21/2780616.html    SQL Server中多行多列连接成为单行单列

http://bbs.csdn.net/topics/290027070     sql多行数据变多列标题实现方式

转自:http://www.127cq.com/thread/2692/1/1.html 如下:

原表字段如下: 编号 日期      时间 5093  2005-3-5 07:45 5093 2005-3-5 11:55 5093  2005-3-5 13:21 5093  2005-3-5 17:26
转换后如下: 编号    日期      时间1    时间2    时间3    时间4 5093  2005-3-5  07:45    11:55  13:21    17:26

这个问题第1个解决方法:

SELECT 编号,日期,

       MAX(CASE ID WHEN 1 THEN 时间 END) 时间1,

       MAX(CASE ID WHEN 2 THEN 时间 END) 时间2,

       MAX(CASE ID WHEN 3 THEN 时间 END) 时间3,

       MAX(CASE ID WHEN 4 THEN 时间 END) 时间4

FROM 

(

   SELECT 编号,日期,时间,

          ID=(SELECT COUNT(*)

              FROM tb_name

              WHERE a.编号=编号

                   AND a.日期=日期

                   AND a.时间>=时间)

   FROM tb_name AS a

) AS t

GROUP BY 编号,日期;


这个问题第2个解决方法:
CREATE TABLE TB(编号 VARCHAR(5), 日期 VARCHAR(10),      时间 VARCHAR(5))
INSERT TB
SELECT '5093',  '2005-3-5',  '07:45' UNION ALL
SELECT '5093',  '2005-3-5',  '11:55' UNION ALL
SELECT '5093',  '2005-3-5',  '13:21' UNION ALL
SELECT '5093',  '2005-3-5',  '17:26'

DECLARE @SQL NVARCHAR(4000)
DECLARE @CNT INT
SET @SQL=N''
SET @CNT=1
SELECT @SQL=@SQL+N','+N' MAX(CASE WHEN 时间='''+时间+N''' THEN 时间 END) AS [时间'+RTRIM(@CNT)+']',@CNT=@CNT+1
FROM TB
GROUP BY 时间

SET @SQL=N'SELECT 编号,日期'+@SQL+ N' FROM TB GROUP BY 编号,日期'

--PRINT @SQL
EXEC(@SQL)

DROP TABLE TB
/*
编号    日期         时间1   时间2   时间3   时间4  
----- ---------- ----- ----- ----- -----
5093  2005-3-5   07:45 11:55 13:21 17:26
*/


这个问题第3个解决方法: CREATE TABLE TB(编号 VARCHAR(5), 日期 VARCHAR(10),      时间 VARCHAR(5)) INSERT TB SELECT '5093',  '2005-3-5',  '07:45' UNION ALL
SELECT '5093',  '2005-3-5',  '11:55' UNION ALL SELECT '5093',  '2005-3-5',  '13:21' UNION ALL SELECT '5093',  '2005-3-5',  '17:26'
select *,id=row_number() OVER ( ORDER BY 日期)  from tb SELECT 编号,日期,
      MAX(CASE ID WHEN 1 THEN 时间 END) 时间1,       MAX(CASE ID WHEN 2 THEN 时间 END) 时间2,       MAX(CASE ID WHEN 3 THEN 时间 END) 时间3,       MAX(CASE ID WHEN 4 THEN 时间 END) 时间4 FROM (   select *,id=row_number() OVER ( ORDER BY 日期)  from tb ) AS t GROUP BY 编号,日期;

 

备注:编号必须要相等,否会查询会成多行多列.

posted @ 2014-03-26 14:03  LuckyZ  阅读(571)  评论(0编辑  收藏  举报