跨天查询问题 20JJkukow]

发布时间:2017-1-25 3:27:07 编辑:www.fx114.net 分享查询网我要评论
本篇文章主要介绍了"跨天查询问题 20JJkukow]",主要涉及到跨天查询问题 20JJkukow]方面的内容,对于跨天查询问题 20JJkukow]感兴趣的同学可以参考一下。

我们经常用到日期查询,要写个复杂的查询有时很是复杂,现在遇到一个跨天查询的例子!如下: use tempdb go create table T1(id int,name varchar(4),kind bit,start_time varchar(5),end_time varchar(5)) insert T1 select 1,'早',0,'07:01','10:00' union all select 2,'中',0,'10:01','15:00' union all select 3,'晚',0,'15:01','22:00' union all select 4,'夜',1,'22:01','07:00'   (kind 为1表示跨天) create table T2(id int identity(1,1),dt datetime,amount money) insert t2 select '2007-05-02 10:34:10',7.5 union all select '2007-05-03 03:10:10',11.1 union all select '2007-05-03 15:12:11',5.5 union all select '2007-05-04 19:10:10',3.5 我要查询出以下结果: 日期    次数(早)     金额(早)   次数(中)     金额(中) 次数(晚)     金额(晚) 次数(夜)     金额(夜)   合计次数  合计金额 2007-05-02  0         0        1          7.5      0             0      1           11.1        2       18.6 2007-05-03  0         0        0          0        1             5.5    0           0           1       5.5 2007-05-04  0         0        0          0        1             3.5    0           0           1       3.5 如何写SQL语句

ding

with tb as ( select convert(varchar(10),t2.dt,120) date,amount,name from t1 ,t2  where 1= case t1.kind when 0 then (case when convert(varchar(5),t2.dt,8) between t1.start_time and t1.end_time then 1 else 0 end)   else (case when convert(varchar(5),t2.dt,8) >= t1.start_time or convert(varchar(5),t2.dt,8)<=t1.end_time then 1 else 0 end)  end ) select 日期=a.date ,[次数(早)]=b.[早],[金额(早)]=a.[早] ,[次数(中)]=b.[中],[金额(中)]=a.[中] ,[次数(晚)]=b.[晚],[金额(晚)]=a.[晚] ,[次数(夜)]=b.[夜],[金额(夜)]=a.[夜] ,合计次数=b.[早]+b.[中]+b.[晚]+b.[夜] ,合计金额=a.[早]+a.[中]+a.[晚]+a.[夜] from  ( select date,isnull([早],0) as [早],isnull([中],0) as [中],isnull([晚],0) as [晚],isnull([夜],0) as [夜] from tb pivot (sum(amount) for name in ([早],[中],[晚],[夜])) as piv1 ) a, ( select date,[早],[中],[晚],[夜] from tb pivot (count(amount) for name in ([早],[中],[晚],[夜])) as piv2 ) b where a.date=b.date

可能没解释清楚 其中 T1表     union all select 4,'夜',1,'22:01','07:00'   (kind 为1表示跨天) 也就是说 T2表中       insert t2 select '2007-05-02 10:34:10',7.5        union all select '2007-05-03 03:10:10',11.1 这两条记录其实发生在同一天即(2007-05-02)这天的(中)和(夜) 这样大家清楚了吗?非常谢谢帮我人们 如果分不够可以另给  

哦,那修改一下: with tb as ( select convert(varchar(10),case  when t1.kind=1 and convert(varchar(5),t2.dt,8)<=t1.end_time then dateadd(day,-1,t2.dt) else t2.dt end,120) date ,amount,name from t1 ,t2  where 1= case t1.kind when 0 then (case when convert(varchar(5),t2.dt,8) between t1.start_time and t1.end_time then 1 else 0 end)   else (case when convert(varchar(5),t2.dt,8) >= t1.start_time or convert(varchar(5),t2.dt,8)<=t1.end_time then 1 else 0 end)  end ) select 日期=a.date ,[次数(早)]=b.[早],[金额(早)]=a.[早] ,[次数(中)]=b.[中],[金额(中)]=a.[中] ,[次数(晚)]=b.[晚],[金额(晚)]=a.[晚] ,[次数(夜)]=b.[夜],[金额(夜)]=a.[夜] ,合计次数=b.[早]+b.[中]+b.[晚]+b.[夜] ,合计金额=a.[早]+a.[中]+a.[晚]+a.[夜] from  ( select date,isnull([早],0) as [早],isnull([中],0) as [中],isnull([晚],0) as [晚],isnull([夜],0) as [夜] from tb pivot (sum(amount) for name in ([早],[中],[晚],[夜])) as piv1 ) a, ( select date,[早],[中],[晚],[夜] from tb pivot (count(amount) for name in ([早],[中],[晚],[夜])) as piv2 ) b where a.date=b.date

to:小小羊 大哥 你可否解释一下上面的代码啊?我看不太懂. 其中with ta as ()  在查询分析器里编辑通不过  是否没写完整啊? pivot (sum(amount) for name in ([早],[中],[晚],[夜])) as piv1  这句话的意思是什么啊?

汗,这个是2005的语句 你用的是不是SQL 2005 啊

我用的是SQL 2000  

哦,那我写过个2000版的给你

好的,谢谢!!!

select *  ,合计次数 = [次数(早)]+[次数(中)]+[次数(晚)]+[次数(夜)] ,合计金额 = [金额(早)]+[金额(中)]+[金额(晚)]+[金额(夜)] from ( select date ,sum(case when name='早' then 1 else 0 end) as [次数(早)] ,sum(case when name='早' then amount else 0 end) as [金额(早)] ,sum(case when name='中' then 1 else 0 end) as [次数(中)]  ,sum(case when name='中' then amount else 0 end) as [金额(中)]  ,sum(case when name='晚' then 1 else 0 end) as [次数(晚)]  ,sum(case when name='晚' then amount else 0 end) as [金额(晚)]  ,sum(case when name='夜' then 1 else 0 end) as [次数(夜)]   ,sum(case when name='夜' then amount else 0 end) as [金额(夜)]  from ( select convert(varchar(10),case  when t1.kind=1 and convert(varchar(5),t2.dt,8)<=t1.end_time then dateadd(day,-1,t2.dt) else t2.dt end,120) date ,amount,name from t1 ,t2  where 1= case t1.kind when 0 then (case when convert(varchar(5),t2.dt,8) between t1.start_time and t1.end_time then 1 else 0 end)   else (case when convert(varchar(5),t2.dt,8) >= t1.start_time or convert(varchar(5),t2.dt,8)<=t1.end_time then 1 else 0 end)  end ) a group by date ) m

真厉害!佩服!加我QQ或者给我你QQ好吗? 我QQ:93689974

上一篇:SQL2005复制技术解决方案,高分求助 100cuizg]
下一篇:头一次写SQL存储过程代码,请高手给评价一下,哪里不好请帮忙说说,第一次写不知道这样写性能如何!请各位帮忙指定!谢谢! 10分,无满意结帖,结帖人xsan_3]

相关文章

相关评论