SQLServer将多行数据合并成一行多列的3个解决方法
(2012-06-04 18:23:31)
标签:
文化 |
原表字段如下:
编号 日期 时间
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个解决方法:
这个问题第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
这个问题第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 编号,日期;
编号 日期 时间
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
这个问题第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 编号,日期;