SQL交叉报表

 

在数据库板块看到一个问题:

col1 col2 col3
a 100 2009-1-5
a 80 2009-1-8
b 300 2009-1-9
b 60 2009-1-7
c 100 2009-1-9
c 150 2009-1-10

根据日期区间查询(例如查询 2009/1/4到2009/1/10)得到以下结果

col1 2009-1-4 2009-1-5 2009-1-6 2009-1-7 2009-1-8 2009-1-9 2009-1-10
a 0 100 0 0 80 0 0
b 0 0 0 60 0 300 0
c 0 0 0 0 0 100 150

这是一个数据库交叉报表的问题,经常碰到的是固定的列,但是这个问题中,日期是不固定的,查询间隔可多可少,具体实现方法如下。

 

 create table t
(
 col1 varchar(10),
 col2 int,
 col3 datetime
)

insert into t (col1,col2,col3)values('a',100,'2009-1-5')
insert into t (col1,col2,col3)values('a',80,'2009-1-8')
insert into t (col1,col2,col3)values('b',300,'2009-1-9')
insert into t (col1,col2,col3)values('b',60,'2009-1-7')
insert into t (col1,col2,col3)values('c',100,'2009-1-9')
insert into t (col1,col2,col3)values('c',150,'2009-1-10')

declare @beginDate datetime --查询开始时间
declare @endDate datetime --查询结束时间
declare @sql varchar(8000)
set @beginDate = cast('2009-1-4' as datetime)
set @endDate = cast('2009-1-10' as datetime)
set @sql = 'select col1,'
while (datediff(d,@beginDate,@endDate)>0) --循环添加日期列
begin
 set @sql = @sql + 'sum(case col3 when '''+cast(@beginDate as varchar)+''' then col2 else 0 end) as '''+convert(varchar(10),@beginDate,120)+''','
 set @beginDate = dateadd(d,1,@beginDate)
end
set @sql = @sql + 'sum(case col3 when '''+cast(@beginDate as varchar)+''' then col2 else 0 end) as '''+convert(varchar(10),@beginDate,120)+''' '
set @sql = @sql + 'from t group by col1'

exec(@sql)

执行结果

------------------------
  col1 2009-01-04 2009-01-05 2009-01-06 2009-01-07 2009-01-08 2009-01-09 2009-01-10
1 a         0         100         0          0          80         0          0
2 b         0          0          0          60         0          300        0
3 c         0          0          0          0          0          100        150

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值