日期:2014-05-18  浏览次数:20495 次

求一个sql 或者存储过程
id 时间 甲线石灰石 乙线石灰 石脱硫电量
1 k 06:30:30 4545 21 23
2 j 07:30:00 6547 312 1312
3 k 08:21:00 678 7878 78898
4 j 08:55:00 789 77878 345355


  这是我的 表结构 和数据 k 开头的 就是 开始时间 j开头的就是结束时间 根据这个表结构 

怎么能得到 比如:id为1,2这两条记录 要显示出来 开始时间 结束时间 6547-4545的值 312-21的值 1312-23 
一行一行显示 



------解决方案--------------------
如果ID是连续的,则:
SQL code
create table tb(id int,类型 varchar(10),时间 varchar(10),甲线石灰石 int,乙线石灰石 int,脱硫电量 int)
insert into tb select 1,'k','06:30:30',4545,21,23
insert into tb select 2,'j','07:30:00',6547,312,1312
insert into tb select 3,'k','08:21:00',678,7878,78898
insert into tb select 4,'j','08:55:00',789,77878,345355
go
select a.时间 开始时间,b.时间 结束时间,
b.甲线石灰石-a.甲线石灰石 as 甲线石灰石,
b.乙线石灰石-a.乙线石灰石 as 乙线石灰石,
b.脱硫电量-a.脱硫电量 as 脱硫电量
from tb a inner join tb b on a.id=b.id-1 and a.类型='k' and b.类型='j'
/*
开始时间       结束时间       甲线石灰石       乙线石灰石       脱硫电量
---------- ---------- ----------- ----------- -----------
06:30:30   07:30:00   2002        291         1289
08:21:00   08:55:00   111         70000       266457

(2 行受影响)

*/
go
drop table tb

------解决方案--------------------
好吧,貌似没少字段,LZ把k和j放在和时间一起了,不建议这样,不过一定要这样如下:
SQL code


--> 测试数据: [tb]
if object_id('[tb]') is not null drop table [tb]
create table [tb] (id int,时间 varchar(20),甲线石灰石 int,乙线石灰石 int,脱硫电量 int)
insert into [tb]
select 1,'k 06:30:30',4545,21,23 union all
select 2,'j 07:30:00',6547,312,1312 union all
select 3,'k 08:21:00',678,7878,78898 union all
select 4,'j 08:55:00',789,77878,345355

--开始查询
;with cte as(
select rid=ROW_NUMBER() over (order by id),type=LEFT(时间,1),time=RIGHT(时间,8),甲线石灰石,乙线石灰石,脱硫电量 from tb
)
select 开始时间=a.time,
结束时间=b.time,
甲=b.甲线石灰石-a.甲线石灰石,
乙=b.乙线石灰石-a.乙线石灰石,
电量=b.脱硫电量-a.脱硫电量
from cte a join cte b on(a.rid=b.rid-1)
where a.type='k' and b.type='j'

--结束查询
drop table [tb]

/*
开始时间             结束时间             甲           乙           电量
---------------- ---------------- ----------- ----------- -----------
06:30:30         07:30:00         2002        291         1289
08:21:00         08:55:00         111         70000       266457

(2 行受影响)

------解决方案--------------------
2000,不包含ID,仅计算k,j交会处的差额:

SQL code
create table tb(类型 varchar(10),时间 varchar(10),甲线石灰石 int,乙线石灰石 int,脱硫电量 int)
insert into tb select 'k','06:25:00',3254,10,5
insert into tb select 'k','06:30:30',4545,21,23
insert into tb select 'j','07:30:00',6547,312,1312
insert into tb select 'k','08:21:00',678,7878,78898
insert into tb select 'j','08:55:00',789,77878,345355
go
select a.时间 开始时间,b.时间 结束时间,
b.甲线石灰石-a.甲线石灰石 as 甲线石灰石,
b.乙线石灰石-a.乙线石灰石 as 乙线石灰石,
b.脱硫电量-a.脱硫电量 as 脱硫电量
from tb a inner join tb b on a.类型='k' and b.类型='j' and a.时间<b.时间 and not exists(
select 1 from tb where 时间>a.时间 and 时间<b.时间)
/*
开始时间       结束时间       甲线石灰石       乙线石灰石       脱硫电量
---------- ---------- ----------- ----------- -----------
06:30:30   07:30:00   2002        291         1289
08:21:00   08:55:00   111         70000       266457

(2 行受影响)

*/
go
drop table tb