加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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个解决方法:

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 编号,日期;

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有