首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

大家帮忙看看,这个SQL如何写?(报表数据源),多谢(dc_ding已经给答案,但需要修改)

2012-03-11 
大家帮忙看看,这个SQL怎么写?(报表数据源),谢谢(dc_ding已经给答案,但需要修改)源问题:源数据:SIDSNAMEDAT

大家帮忙看看,这个SQL怎么写?(报表数据源),谢谢(dc_ding已经给答案,但需要修改)
源问题:

源数据:
SID           SNAME                 DATE                               CLICKS
1               IE                       2006-09-01                   102    
1               IE                       2006-09-02                   95
1               IE                       2006-09-04                   69
1               IE                       2006-09-05                   24
1               IE                       2006-09-08                   89
1               IE                       2006-09-09                   145

其中源数据中,缺少,3,6,7   月的数据
我怎么写SQL能查询出如下结果:
SID           SNAME                 DATE                               CLICKS
1               IE                       2006-09-01                   102    
1               IE                       2006-09-02                   95
1               IE                       2006-09-03                   0(没有出现的月设置为0)
1               IE                       2006-09-04                   69
1               IE                       2006-09-05                   24
1               IE                       2006-09-06                   0
1               IE                       2006-09-07                   0
1               IE                       2006-09-08                   89
1               IE                       2006-09-09                   145



谢谢大家!

----------------------------------------------
dc_ding给出的答案

--建立存储过程
create   proc   test_proc  
@startdate   datetime,
@enddate   datetime
as
declare   @testdb   table(SID   int,   SNAME   varchar(10),   [DATE]   datetime,CLICKS   int)
insert   @testdb
select   1, 'IE ', '2006-09-01 ',102   union   all
select   1, 'IE ', '2006-09-02 ',95   union   all
select   1, 'IE ', '2006-09-04 ',69   union   all
select   1, 'IE ', '2006-09-05 ',24   union   all
select   1, 'IE ', '2006-09-08 ',89   union   all
select   1, 'IE ', '2006-09-09 ',145

select
SID=isnull(SID,(select   top   1   SID   from   @testdb     where   [DATE] <dateadd(day,b.x,a.[DATE])   order   by   [DATE]   desc)),
SNAME=isnull(SNAME,(select   top   1   SNAME   from   @testdb     where   [DATE] <dateadd(day,b.x,a.[DATE])   order   by   [DATE]   desc)),
[DATE]=dateadd(day,b.x,a.[DATE]),
CLICKS=isnull(c.CLICKS,0)  
from  
(select   min([DATE])   [DATE]   from   @testdb   where   [DATE]> =@startdate)   a  
cross   join  
(
SELECT     b8.i   +   b7.i   +   b6.i   +   b5.i   +   b4.i   +   b3.i   +   b2.i   +   b1.i   +   b0.i   x
FROM(SELECT   0   i   UNION   ALL   SELECT   1)   b0
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   2)   b1
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   4)   b2
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   8)   b3
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   16)   b4
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   32)   b5
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   64)   b6
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   128)   b7
CROSS   JOIN(SELECT   0   i   UNION   ALL   SELECT   256)   b8
)b  
left   join  
@testdb   c   on   dateadd(day,b.x,a.[DATE])=c.[DATE]  
where   dateadd(day,b.x,a.[DATE]) <@enddate   and   dateadd(day,b.x,a.[DATE])> =@startdate
order   by   3
go

--调用存储过程
exec   test_proc   '2006-09-01 ', '2006-09-08 '
go

--删除存储过程
drop   proc   test_proc

--查看结果
/*
SIDSNAMEDATE                   CLICKS
1IE2006-09-01   00:00:00.000102
1IE2006-09-02   00:00:00.00095
1IE2006-09-03   00:00:00.0000
1IE2006-09-04   00:00:00.00069
1IE2006-09-05   00:00:00.00024
1IE2006-09-06   00:00:00.0000
1IE2006-09-07   00:00:00.0000
1IE2006-09-08   00:00:00.00089
*/


-------------------------------------------
新问题dc_ding给出的答案,有局限性,如果数据源是从09-01到09-08,而exec   test_proc   '2006-08-01 ', '2006-09-08 '(时间段从8月开始)那么,将不出现8月的,就是说dc_ding写的只能以数据源中,最小时间开始.

请问这个过程脚本应该怎样修改才能显示指定时间段内所有月份数据


------解决方案--------------------


有点不对...SID 和 SNAME ~~~你想怎么判断~~~~~
[解决办法]
要显示最小日期以前的日期,就把里面的条件去掉 [date] between @s and @e
[解决办法]
--建立存储过程
create proc test_proc
@startdate datetime,
@enddate datetime
as
declare @testdb table(SID int, SNAME varchar(10), [DATE] datetime,CLICKS int)
insert @testdb
select 1, 'IE ', '2006-09-01 ',102 union all
select 1, 'IE ', '2006-09-02 ',95 union all
select 1, 'IE ', '2006-09-04 ',69 union all
select 1, 'IE ', '2006-09-05 ',24 union all
select 1, 'IE ', '2006-09-08 ',89 union all
select 1, 'IE ', '2006-09-09 ',145

select distinct
SID=isnull(SID,(select top 1 SID from @testdb where [DATE] <dateadd(day,b.x,a.[DATE]) or [DATE]> dateadd(day,-b.x,a.[DATE]) order by [DATE] desc))
,SNAME=isnull(SNAME,(select top 1 SNAME from @testdb where [DATE] <dateadd(day,b.x,a.[DATE]) or [DATE]> dateadd(day,-b.x,a.[DATE]) order by [DATE] desc))
,[DATE]=dateadd(day,b.x,a.[DATE])
,CLICKS=isnull(c.CLICKS,0)
from
(select @startdate as [DATE] from @testdb) a
cross join
(
SELECT b8.i + b7.i + b6.i + b5.i + b4.i + b3.i + b2.i + b1.i + b0.i x
FROM(SELECT 0 i UNION ALL SELECT 1) b0
CROSS JOIN(SELECT 0 i UNION ALL SELECT 2) b1
CROSS JOIN(SELECT 0 i UNION ALL SELECT 4) b2
CROSS JOIN(SELECT 0 i UNION ALL SELECT 8) b3
CROSS JOIN(SELECT 0 i UNION ALL SELECT 16) b4
CROSS JOIN(SELECT 0 i UNION ALL SELECT 32) b5
CROSS JOIN(SELECT 0 i UNION ALL SELECT 64) b6
CROSS JOIN(SELECT 0 i UNION ALL SELECT 128) b7
CROSS JOIN(SELECT 0 i UNION ALL SELECT 256) b8
) b
left join
@testdb c on dateadd(day,b.x,a.[DATE])=c.[DATE]
where dateadd(day,b.x,a.[DATE]) <=@enddate and dateadd(day,b.x,a.[DATE])> =@startdate
order by 3
go

--调用存储过程
exec test_proc '2006-08-28 ', '2006-09-12 '
go

--删除存储过程
drop proc test_proc

--查看结果
/*
SIDSNAMEDATECLICKS
---------------------------------------------------
1IE2006-08-28 00:00:00.0000
1IE2006-08-29 00:00:00.0000
1IE2006-08-30 00:00:00.0000
1IE2006-08-31 00:00:00.0000
1IE2006-09-01 00:00:00.000102
1IE2006-09-02 00:00:00.00095
1IE2006-09-03 00:00:00.0000
1IE2006-09-04 00:00:00.00069
1IE2006-09-05 00:00:00.00024
1IE2006-09-06 00:00:00.0000
1IE2006-09-07 00:00:00.0000
1IE2006-09-08 00:00:00.00089
1IE2006-09-09 00:00:00.000145
1IE2006-09-10 00:00:00.0000
1IE2006-09-11 00:00:00.0000
1IE2006-09-12 00:00:00.0000
*/

热点排行
Bad Request.