求SQL语句谢谢!!

yifan1008 2007-09-28 11:12:55
表TT如下:
idno B icdate ictime
000008 1 2007/9/26 01:00:00
000008 1 2007/9/26 07:00:00
000008 1 2007/9/26 12:30:00
000008 1 2007/9/26 13:30:00
000008 1 2007/9/26 17:00:00
000008 1 2007/9/27 00:30:00
000011 2 2007/9/26 13:00:00
000011 2 2007/9/26 19:00:00
000011 2 2007/9/26 23:00:00
000011 2 2007/9/27 01:00:00
000011 2 2007/9/27 07:00:00
000011 2 2007/9/27 11:30:00
000011 2 2007/9/27 12:30:00

要得 到查询结果
idno b icdate T1 T2 T3 T4 T5 T6
000008 1 2007/9/26 01:00:00 07:00:00 12:30:00 13:30:00 17:00:00 00:30:00
T7 T8
null null
000011 2 2007/9/26 13:00:00 19:00:00 23:00:00 01:00:00 07:00:00 11:30:00
T7 T8
12:30:00 null
注:
B 为1 的 第一天13:00~ 第二天12:30
B 为2 的 第一天1:00 ~ 第二天00:30
查询分析出如上 T1~T8 个时间段先后也如上。超出8个的可以不用理会。注意icdate 的日期。
先谢谢各位了!!
...全文
340 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Limpire 2007-09-28
  • 打赏
  • 举报
回复
B 为1 的 T1~T8 的时间数 第一天13:00~ 第二天12:30 之间和包含13:00 到第二天12:30

按照上面规则,不懂:

为什么 2007/9/27 00:30:00 就放在 2007/9/26 显示
而 2007/9/27 07:30:00 10:10:00 12:30 又在 2007/9/27 显示
难道 2007/9/27 00:30:00 不属于第一天(26)13:00~ 第二天(27)12:30之间。

为什么 2007/9/26 01:00:00 07:00:00 12:30:00 又显示,并不在上面规则的范围。

规则2也有同样的疑惑。
Limpire 2007-09-28
  • 打赏
  • 举报
回复
哦,我再看看
Limpire 2007-09-28
  • 打赏
  • 举报
回复
--原始数据:#A
create table #A(idno varchar(6),B int,icdate varchar(10),ictime varchar(8))
insert #A
select '000008',1,'2007/9/26','01:00:00' union all
select '000008',1,'2007/9/26','07:00:00' union all
select '000008',1,'2007/9/26','12:30:00' union all
select '000008',1,'2007/9/26','13:30:00' union all
select '000008',1,'2007/9/26','17:00:00' union all
select '000008',1,'2007/9/27','00:30:00' union all
select '000008',1,'2007/9/27','07:30:00' union all
select '000011',2,'2007/9/26','13:00:00' union all
select '000011',2,'2007/9/26','19:00:00' union all
select '000011',2,'2007/9/26','23:00:00' union all
select '000011',2,'2007/9/27','01:00:00' union all
select '000011',2,'2007/9/27','07:00:00' union all
select '000011',2,'2007/9/27','11:30:00' union all
select '000011',2,'2007/9/27','12:30:00'

declare @Max int,@T varchar(10),@sql varchar(8000)
set @T=1
while @T<=8
select @sql=coalesce(@sql+',','select idno,icdate,')+'[T'+@T+']=max(case CT when '+@T+' then ictime end)',@T=@T+1
set @sql = @sql+' from (select CT=(select count(1) from #A where idno=a.idno and B=a.B and icdate=a.icdate and ictime<=a.ictime), * from #A a) a group by idno,icdate order by idno'
exec (@sql)

/*
odno icdate T1 T2 T3 T4 T5 T6 T7 T8
000008 2007/9/26 01:00:00 07:00:00 12:30:00 13:30:00 17:00:00 NULL NULL NULL
000008 2007/9/27 00:30:00 07:30:00 NULL NULL NULL NULL NULL NULL
000011 2007/9/26 13:00:00 19:00:00 23:00:00 NULL NULL NULL NULL NULL
000011 2007/9/27 01:00:00 07:00:00 11:30:00 12:30:00 NULL NULL NULL NULL
*/

--删除对象
drop table #A
yifan1008 2007-09-28
  • 打赏
  • 举报
回复
create table #A(idno varchar(6),B int,icdate varchar(10),ictime varchar(8))
insert #A
select '000008',1,'2007/9/26','01:00:00' union all
select '000008',1,'2007/9/26','07:00:00' union all
select '000008',1,'2007/9/26','12:30:00' union all
select '000008',1,'2007/9/26','13:30:00' union all
select '000008',1,'2007/9/26','17:00:00' union all
select '000008',1,'2007/9/27','00:30:00' union all
select '000011',2,'2007/9/26','13:00:00' union all
select '000011',2,'2007/9/26','19:00:00' union all
select '000011',2,'2007/9/26','23:00:00' union all
select '000011',2,'2007/9/27','01:00:00' union all
select '000011',2,'2007/9/27','07:00:00' union all
select '000011',2,'2007/9/27','11:30:00' union all
select '000008',1,'2007/9/27','07:30:00' union all
select '000008',1,'2007/9/27','10:10:00' union all
select '000008',1,'2007/9/27','12:30:00' union all
select '000011',2,'2007/9/27','12:30:00'

要得到,
odno icdate T1 T2 T3 T4 T5 T6 T7 T8
000008 2007/9/26 01:00:00 07:00:00 12:30:00 13:30:00 17:00:00 00:30:00 NULL NULL
000011 2007/9/26 13:00:00 19:00:00 23:00:00 01:00:00 07:00:00 11:30:00 12:30:00 NULL
000008 2007/9/27 07:30:00 10:10:00 12:30 NULL NULL NULL NULL NULL

B 为1 的 T1~T8 的时间数 第一天13:00~ 第二天12:30 之间和包含13:00 到第二天12:30
B 为2 的 T1~T8 的时间数 第一天1:00 ~ 第二天00:30 之间和包含1:00 到第二天00:30


yifan1008 2007-09-28
  • 打赏
  • 举报
回复
Limpire(昨夜小楼)

在临时表里加多一条记录。
000008 1 2007/9/27 07:30:00
要在你的结果里,多一条记录。
odno icdate T1 T2 T3 T4 T5 T6 T7 T8
000008 2007/9/27 01:00:00 NULL NULL NULL NULL NULL NULL

B 为1 的 T1~T8 的时间数 第一天13:00~ 第二天12:30 之间和包含13:00 到第二天12:30
B 为2 的 T1~T8 的时间数 第一天1:00 ~ 第二天00:30 之间和包含1:00 到第二天00:30
**





Limpire 2007-09-28
  • 打赏
  • 举报
回复
好像楼主一定要8个字段,超出不管,还是不知道理解对不对。
Limpire 2007-09-28
  • 打赏
  • 举报
回复
不知道理解对不对
Limpire 2007-09-28
  • 打赏
  • 举报
回复
说白了就是根据 B 分组,icdate 取最小,其它照旧。
Limpire 2007-09-28
  • 打赏
  • 举报
回复
--原始数据:#A
create table #A(idno varchar(6),B int,icdate varchar(10),ictime varchar(8))
insert #A
select '000008',1,'2007/9/26','01:00:00' union all
select '000008',1,'2007/9/26','07:00:00' union all
select '000008',1,'2007/9/26','12:30:00' union all
select '000008',1,'2007/9/26','13:30:00' union all
select '000008',1,'2007/9/26','17:00:00' union all
select '000008',1,'2007/9/27','00:30:00' union all
select '000011',2,'2007/9/26','13:00:00' union all
select '000011',2,'2007/9/26','19:00:00' union all
select '000011',2,'2007/9/26','23:00:00' union all
select '000011',2,'2007/9/27','01:00:00' union all
select '000011',2,'2007/9/27','07:00:00' union all
select '000011',2,'2007/9/27','11:30:00' union all
select '000011',2,'2007/9/27','12:30:00'

declare @Max int,@T varchar(10),@sql varchar(8000)
set @T=1
while @T<=8
select @sql=coalesce(@sql+',','select idno,min(icdate),')+'[T'+@T+']=max(case CT when '+@T+' then ictime end)',@T=@T+1
set @sql = @sql+' from (select CT=(select count(1) from #A where idno=a.idno and B=a.B and icdate+ictime<=a.icdate+a.ictime), * from #A a) a group by idno,B'
exec (@sql)

/*
odno icdate T1 T2 T3 T4 T5 T6 T7 T8
000008 2007/9/26 01:00:00 07:00:00 12:30:00 13:30:00 17:00:00 00:30:00 NULL NULL
000011 2007/9/26 13:00:00 19:00:00 23:00:00 01:00:00 07:00:00 11:30:00 12:30:00 NULL
*/

--删除对象
drop table #A
dawugui 2007-09-28
  • 打赏
  • 举报
回复
这下我可看不懂了?
yifan1008 2007-09-28
  • 打赏
  • 举报
回复
dawugui(潇洒老乌龟)
csdn 排版不好用

表TT如下:
idno B icdate ictime
000008 1 2007/9/26 01:00:00
000008 1 2007/9/26 07:00:00
000008 1 2007/9/26 12:30:00
000008 1 2007/9/26 13:30:00
000008 1 2007/9/26 17:00:00
000008 1 2007/9/27 00:30:00
000011 2 2007/9/26 13:00:00
000011 2 2007/9/26 19:00:00
000011 2 2007/9/26 23:00:00
000011 2 2007/9/27 01:00:00
000011 2 2007/9/27 07:00:00
000011 2 2007/9/27 11:30:00
000011 2 2007/9/27 12:30:00

和昨天的有所不同了,
要 判断 B 字段的值加上时间字段的时间来判断 时间 应改放到那个日期里, 还有 T1到T8 的时间不能用按时间大小来排了,因为结果中一条记录里可能包含了,第二天的时间,但是没有了日期。
dawugui 2007-09-28
  • 打赏
  • 举报
回复
--用你昨天的数据测试<=4的情况,<=8的情况类似,把数据改了就行了.

create table tb(idbo varchar(10),dd int,Sdate varchar(10),stime varchar(10))
insert into tb values('000008',1,'2007/09/26','08:00:00')
insert into tb values('000008',1,'2007/09/26','12:30:00')
insert into tb values('000008',1,'2007/09/26','13:30:00')
insert into tb values('000008',1,'2007/09/26','17:00:00')
insert into tb values('000011',1,'2007/09/26','07:30:00')
insert into tb values('000011',1,'2007/09/26','11:30:00')
insert into tb values('000011',1,'2007/09/26','11:45:00')
insert into tb values('000011',1,'2007/09/26','16:30:00')
insert into tb values('000011',1,'2007/09/26','16:45:00')
insert into tb values('000011',1,'2007/09/26','21:00:00')
insert into tb values('000008',1,'2007/09/27','08:20:07')
insert into tb values('000008',1,'2007/09/27','12:20:00')
insert into tb values('000008',1,'2007/09/27','13:00:00')
insert into tb values('000008',1,'2007/09/27','17:30:00')
go
declare @sql varchar(8000)
set @sql = 'select idbo,Sdate'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then stime else '' '' end) [T' + cast(px as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where idbo=t.idbo and Sdate = t.Sdate and stime<t.stime)+1 , * from tb t) m where px <= 4) as a
set @sql = @sql + ' from (select px=(select count(1) from tb where idbo=t.idbo and Sdate = t.Sdate and stime<t.stime)+1 , * from tb t) m where px <= 4 group by idbo,Sdate'
exec(@sql)


/*
idbo Sdate T1 T2 T3 T4
---------- ---------- ---------- ---------- ---------- ----------
000008 2007/09/26 08:00:00 12:30:00 13:30:00 17:00:00
000011 2007/09/26 07:30:00 11:30:00 11:45:00 16:30:00
000008 2007/09/27 08:20:07 12:20:00 13:00:00 17:30:00
*/

drop table tb
dawugui 2007-09-28
  • 打赏
  • 举报
回复
declare @sql varchar(8000)
set @sql = 'select idbo,Sdate'
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then stime else '' '' end) [T' + cast(px as varchar) + ']'
from (select distinct px from (select px=(select count(1) from tb where idbo=t.idbo and Sdate = t.Sdate and stime<t.stime)+1 , * from tb t) m where px <= 8) as a
set @sql = @sql + ' from (select px=(select count(1) from tb where idbo=t.idbo and Sdate = t.Sdate and stime<t.stime)+1 , * from tb t) m where px <= 8 group by idbo,Sdate'
exec(@sql)
yifan1008 2007-09-28
  • 打赏
  • 举报
回复
有点乱。
yifan1008 2007-09-28
  • 打赏
  • 举报
回复
设 X为日期
x =2007/09/01

临时表处理后。

idbo 000008 因为B字段值是 1 2007/09/01 ( 的时间 X的13:00 ~ X+1天 的 12:30)

注临时表 idbo 000008 因为B字段值是 1 每天的时间 不会小于 13:00 如小于13:00那就是 昨天的时间。 大于13:00 到 到~(X+1)天12:30 的时间,就是今天的时间。

idbo 000011 因为B字段值是2 2007/09/01 ( 的时间 X的1:00 ~ X+1天 的 00:30)
注临时表 idbo 000008 因为B字段值是2 每天的时间 不会小于 1:00 如小于1:00那就是 昨天的时间。 大于1:00 到 到~(X+1)天00:30 的时间,就是今天的时间。
yifan1008 2007-09-28
  • 打赏
  • 举报
回复
设 X为日期
x =2007/09/01

临时表处理后。

idbo 000008 因为B字段值是 1 2007/09/01 ( 的时间 X的13:00 ~ X+1天 的 12:30)

注临时表 idbo 000008 因为B字段值是 1 每天的时间 不会小于 13:00 如小于13:00那就是 昨天的时间。 大于13:00 到 到~(X+1)天12:30 的时间,就是今天的时间。

idbo 000008 因为B字段值是2 2007/09/01 ( 的时间 X的1:00 ~ X+1天 的 00:30)
注临时表 idbo 000008 因为B字段值是2 每天的时间 不会小于 1:00 如小于1:00那就是 昨天的时间。 大于1:00 到 到~(X+1)天00:30 的时间,就是今天的时间。


谢谢大家的支持,我会陆续上传相关电子书 由于体积较大,本书分两卷压缩,请都下载完再解压! Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(一) http://download.csdn.net/source/3268267 Oracle 11g SQL和PL SQL从入门到精通 pdf格式电子书 下载(二) http://download.csdn.net/source/3268312 内容简介   本书是专门为oracle应用开发人员提供的sql和pl/sql编程指南。通过学习本书,读者不仅可以掌握oracle常用工具oracle universal installer、net comfiguration assistant、sql developer、sql*plus的作用及使用方法,而且可以掌握sql语句和pl/sql的各种基础知识和高级特征(记录类型、集合类型、对象类型、大对象类型)。   除了为读者提供编写sql语句和开发pl/sql块的方法外,本书还为应用开发人员提供了一些常用的pl/sql系统包。通过使用这些pl/sql系统包,应用开发人员可以开发出功能更强大的数据库应用程序。本书不仅适合sql和pl/sql初学者,也适合于有经验的oracle应用开发人员。 前言 第一部分 sql和pl/sql相关工具  第1章 在windows 平台上安装oracle database 11g  第2章 配置网络服务名  第3章 使用sql database  第4章 使用sql*plus 第二部分 sql  第5章 sql和pl/sql综述  第6章 简单查询  第7章 sql单行函数  第8章 操纵数据  第9章 复杂查询  第10章 管理常用对象 第三部分 pl/sql  第11章 pl/sql基础  第12章 访问oracle  第13章 编写控制结构  第14章 使用复合数据类型  第15章 使用游标  第16章 异常处理 . 第17章 本地动态sql  第18章 pl/sql过程  第19章 pl/sql函数  第20章 pl/sql包  第21章 触发器  第22章 使用对象类型 第四部分 pl/sql系统包  第23章 使用大对象  第24章 读写os文件  第25章 开发多媒体应用  第26章 开发web应用  第27章 dbms_sq动态sql  第28章 管理统计  第29章 使用数据库资源管理器  第30章 数据加密和解密  第31章 使用调度程序  第32章 使用flashback  第33章 使用重定义联机表  第34章 修正损坏块  第35章 使用日里民挖掘  第36章 使用管道  第37章 使用精细访问控制  第38章 使用精细审计  第39章 使用预警事件  第40章 转换rowid  第41章 其他常用包 习题答案

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧