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 编号,日期;
备注:编号必须要相等,否会查询会成多行多列.