sql 2000数据库内含有一表
如下:
日期 读数
1 100
2 200
3 248
4 789
5 750
6 800
7 980
8 89
9 300
……(读数最小为0,最大为999)
要求是这样的,查询时,显示界面增加一列“差值”,既下一行减上一行的值。
一般情况下直接减就可以,即便有负数也可以,比如750-789就是负数,没问题。
但如果上一行的值大于900,而本行的值小于100,则需要为正数,比如89-980是负数,则需要取正数(89-980)+1000,既多加1000让他变正。
查询后的结果就是
日期 读数 差值
1 100 0
2 200 100
3 248 148
4 789 545
5 750 -49
6 800 50
7 980 180
8 89 109
9 300 211
……
请问如何实现谢谢。
7 个解决方案
#1
select 日期,读数
,isnull(A.读数-B.读数,0) as 差值
from TB A left join TB B
on A.日期=B.日期+1
#2
select
a.*,
isnull(case when b.读数-a.读数>0 then b.读数-a.读数 else b.读数-a.读数+1000 end,0) as 差值
from
tb a left join tb b
on
a.日期=b.日期-1
#3
要求的话,需要判断(上一行>900,本行<100,差值就+1000),不是(负数+1000)
谢谢
#4
create table t2(日期 int, 读数 int)
insert into t2
select 1, 100 union all
select 2, 200 union all
select 3, 248 union all
select 4, 789 union all
select 5, 750 union all
select 6, 800 union all
select 7, 980 union all
select 8, 89 union all
select 9, 300
select a.*,
case when b.读数>900 and a.读数<100 then (a.读数-isnull(b.读数,0))+1000
else a.读数-isnull(b.读数,0) end '差值'
from t2 a
left join t2 b on a.日期-1=b.日期
日期 读数 差值
----------- ----------- -----------
1 100 100
2 200 100
3 248 48
4 789 541
5 750 -39
6 800 50
7 980 180
8 89 109
9 300 211
(9 row(s) affected)
#5
if object_id('tb','U') is not null
drop table tb
go
create table tb
(
日期 int identity(1,1),
读数 int
)
go
insert into tb(读数)
select 100 union all
select 200 union all
select 248 union all
select 789 union all
select 750 union all
select 800 union all
select 980 union all
select 89 union all
select 300
go
select *,差值=isnull((select case when a.读数<100 and 读数>900 then a.读数-读数+1000 else a.读数-读数 end from tb where 日期=a.日期-1),0) from tb a
/*
日期 读数 差值
----------- ----------- -----------
1 100 0
2 200 100
3 248 48
4 789 541
5 750 -39
6 800 50
7 980 180
8 89 109
9 300 211
(9 行受影响)
*/
#6
谢谢,结贴
#7
declare @T table(日期 int, 读数 int)
insert into @T
select 1, 100 union all
select 2, 200 union all
select 3, 248 union all
select 4, 789 union all
select 5, 750 union all
select 6, 800 union all
select 7, 980 union all
select 8, 89 union all
select 9, 300
SELECT B.读数-A.读数 +CASE WHEN B.读数<100 AND A.读数>900 AND B.读数-A.读数<0 THEN 1000 ELSE 0 END FROM @T A JOIN @T B ON A.日期=B.日期-1;
#1
select 日期,读数
,isnull(A.读数-B.读数,0) as 差值
from TB A left join TB B
on A.日期=B.日期+1
#2
select
a.*,
isnull(case when b.读数-a.读数>0 then b.读数-a.读数 else b.读数-a.读数+1000 end,0) as 差值
from
tb a left join tb b
on
a.日期=b.日期-1
#3
要求的话,需要判断(上一行>900,本行<100,差值就+1000),不是(负数+1000)
谢谢
#4
create table t2(日期 int, 读数 int)
insert into t2
select 1, 100 union all
select 2, 200 union all
select 3, 248 union all
select 4, 789 union all
select 5, 750 union all
select 6, 800 union all
select 7, 980 union all
select 8, 89 union all
select 9, 300
select a.*,
case when b.读数>900 and a.读数<100 then (a.读数-isnull(b.读数,0))+1000
else a.读数-isnull(b.读数,0) end '差值'
from t2 a
left join t2 b on a.日期-1=b.日期
日期 读数 差值
----------- ----------- -----------
1 100 100
2 200 100
3 248 48
4 789 541
5 750 -39
6 800 50
7 980 180
8 89 109
9 300 211
(9 row(s) affected)
#5
if object_id('tb','U') is not null
drop table tb
go
create table tb
(
日期 int identity(1,1),
读数 int
)
go
insert into tb(读数)
select 100 union all
select 200 union all
select 248 union all
select 789 union all
select 750 union all
select 800 union all
select 980 union all
select 89 union all
select 300
go
select *,差值=isnull((select case when a.读数<100 and 读数>900 then a.读数-读数+1000 else a.读数-读数 end from tb where 日期=a.日期-1),0) from tb a
/*
日期 读数 差值
----------- ----------- -----------
1 100 0
2 200 100
3 248 48
4 789 541
5 750 -39
6 800 50
7 980 180
8 89 109
9 300 211
(9 行受影响)
*/
#6
谢谢,结贴
#7
declare @T table(日期 int, 读数 int)
insert into @T
select 1, 100 union all
select 2, 200 union all
select 3, 248 union all
select 4, 789 union all
select 5, 750 union all
select 6, 800 union all
select 7, 980 union all
select 8, 89 union all
select 9, 300
SELECT B.读数-A.读数 +CASE WHEN B.读数<100 AND A.读数>900 AND B.读数-A.读数<0 THEN 1000 ELSE 0 END FROM @T A JOIN @T B ON A.日期=B.日期-1;