读书人

寻求最佳解决方案解决思路

发布时间: 2012-01-30 21:15:58 作者: rapoo

寻求最佳解决方案
sql server中,有150万行数据,第一个字段ID都有1440行记录(对应的时间从00时00分开始),格式为:
如:

22, 2007-06-01 00:01:00.000, 0.3
22, 2007-06-01 00:02:00.000, 0.1
22, 2007-06-01 00:03:00.000, 0.0
22, 2007-06-01 00:04:00.000, 0.0
...................
23, 2007-06-01 00:01:00.000, 0.1
23, 2007-06-01 00:02:00.000, 0.2
23, 2007-06-01 00:03:00.000, 0.1

现在要转换成下面的格式:
22, 0.3 0.1 0.0 0.0 ... ...
23, 0.1 0.2 0.1 ... ... ...
... .......................
请问如何实现才是最佳方案?

[解决办法]
--创建测试数据
create table tb(id int,mydate datetime,value decimal(18,1))
insert into tb values(22, '2007-06-01 00:01:00.000 ',0.3)
insert into tb values(22, '2007-06-01 00:02:00.000 ',0.1)
insert into tb values(22, '2007-06-01 00:03:00.000 ',0.0)
insert into tb values(22, '2007-06-01 00:04:00.000 ',0.0)
insert into tb values(22, '2007-06-01 00:05:00.000 ',0.0)
insert into tb values(22, '2007-06-01 00:06:00.000 ',0.0)
insert into tb values(22, '2007-06-01 01:01:00.000 ',0.3)
insert into tb values(22, '2007-06-01 01:02:00.000 ',0.1)
insert into tb values(22, '2007-06-01 01:03:00.000 ',0.0)
insert into tb values(22, '2007-06-01 01:04:00.000 ',0.0)
insert into tb values(22, '2007-06-01 01:05:00.000 ',0.0)
insert into tb values(22, '2007-06-01 01:06:00.000 ',0.0)
insert into tb values(23, '2007-06-01 00:01:00.000 ',0.1)
insert into tb values(23, '2007-06-01 00:02:00.000 ',0.2)
insert into tb values(23, '2007-06-01 00:03:00.000 ',0.1)
insert into tb values(23, '2007-06-01 00:04:00.000 ',0.0)
insert into tb values(23, '2007-06-01 00:05:00.000 ',0.0)
insert into tb values(23, '2007-06-01 00:06:00.000 ',0.0)
insert into tb values(23, '2007-06-01 01:01:00.000 ',0.1)
insert into tb values(23, '2007-06-01 01:02:00.000 ',0.2)
insert into tb values(23, '2007-06-01 01:03:00.000 ',0.1)
insert into tb values(23, '2007-06-01 01:04:00.000 ',0.0)
insert into tb values(23, '2007-06-01 01:05:00.000 ',0.0)
insert into tb values(23, '2007-06-01 01:06:00.000 ',0.0)
go

select id,convert(varchar(13),mydate,120) '日期+小时 ',
max(case when datepart(minute,mydate) = 0 then value end) '00 ',
max(case when datepart(minute,mydate) = 1 then value end) '01 ',
max(case when datepart(minute,mydate) = 2 then value end) '02 ',
max(case when datepart(minute,mydate) = 3 then value end) '03 ',
max(case when datepart(minute,mydate) = 4 then value end) '04 ',
max(case when datepart(minute,mydate) = 5 then value end) '05 ',
max(case when datepart(minute,mydate) = 6 then value end) '06 '
from tb
group by id,convert(varchar(13),mydate,120)

drop table tb

/*
id 日期+小时 00 01 02 03 04 05 06
----------- ------------- ---- -- --- --- --- -- --
22 2007-06-01 00 NULL .3 .1 .0 .0 .0 .0
23 2007-06-01 00 NULL .1 .2 .1 .0 .0 .0
22 2007-06-01 01 NULL .3 .1 .0 .0 .0 .0
23 2007-06-01 01 NULL .1 .2 .1 .0 .0 .0

(所影响的行数为 4 行)
*/
------解决方案--------------------


很简单的方法,将行合并成一列就能导出了,不需要1440列的。这样也能达到目的。

读书人网 >SQL Server

热点推荐