怎样判断出存在这样一条数据呢,各位帮帮我

geniusqing 2005-08-16 06:13:07
/*
create table ta2(id varchar(4),facid varchar(8),machinenumber varchar(8),number int,repairvalue int,data datetime)

insert into ta2
select '01','aaa', '80#', 100, 120 ,'2005-08-15'
union all select '02','bbb', '90#', 100, 8 ,'2005-08-15'
union all select '03','ccc', '60#', 100, 90 ,'2005-08-15'
union all select '04','ddd', '40#', 100, 150 ,'2005-08-15'
union all select '05','eee', '50#', 100, 300 ,'2005-08-15'

union all select '06','aaa', '80#', 100, 140 ,'2005-08-16'
union all select '07','bbb', '90#', 100, 110 ,'2005-08-16'
union all select '08','fff', '60#', 100, 150 ,'2005-08-16'
union all select '09','ddd', '40#', 100, 80 ,'2005-08-16'
union all select '10','kkk', '50#', 100, 40 ,'2005-08-16'
*/
--drop table ta2
/*
查询2005-08-16
想生成如下结果
id facid machinenumber number repairvalue sign
06 aaa 80# 140 100 是
07 bbb 90# 110 100 否
08 fff 60# 150 100 否
条件是:如果存在与2005-08-16查询结果相同facid,machinenumber最近而且repairvalue>number*1.0时sign为是
*/
--查询2005-08-16的数据
select id,facid,machinenumber,repairvalue,number
from ta2 where repairvalue>number*1.0 and data='2005-08-16'

--相同facid,machinenumber最近而且repairvalue>number*1.0的数据

select b.id, A.facid,A.machinenumber,b.repairvalue,b.number
from ta2 A ,
(select max(id) id ,facid,machinenumber,repairvalue,number from ta2
where data<>'2005-08-16' and repairvalue>number*1.0
group by facid,machinenumber,repairvalue,number) B
where A.machinenumber=b.machinenumber and a.facid=b.facid and data='2005-08-16'
and a.repairvalue>a.number*1.0

--怎样判断出存在这样一条数据呢,各位帮帮我
...全文
162 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
第一种写法是找出满足"相同facid,machinenumber"这个条件的最大ID,然后判断该条记录是否满足“repairvalue>number*1.0”这个条件,满足则SIGN值为“是”,否则为“否”。
第二种方法是直接找满足“相同facid,machinenumber,并且repairvalue>number*1.0”这两个条件的记录,如果找到了,则sign为“是”,否则为“否”
冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
select t3.id,t3.facid,t3.machinenumber,t3.repairvalue,t3.number,case when isnull(sid,'否')='否' then '否' else '是' end as sign
from
(select id,facid,machinenumber,repairvalue,number,
sid=(select max(id) as sid from ta2 where facid=t1.facid and machinenumber=t1.machinenumber and data<>t1.data and repairvalue>number*1.0)
from ta2 t1 where repairvalue>number*1.0 and data='2005-08-16'
)t3

还是这样?

冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
select t3.id,t3.facid,t3.machinenumber,t3.repairvalue,t3.number,case when t2.repairvalue>t2.number*1.0 then '是' else '否' end as sign
from
(select id,facid,machinenumber,repairvalue,number,
sid=(select max(id) from ta2 where facid=t1.facid and machinenumber=t1.machinenumber and data<>t1.data)
from ta2 t1 where repairvalue>number*1.0 and data='2005-08-16'
)t3 left join ta2 t2 on t3.sid=t2.id

这样?
geniusqing 2005-08-17
  • 打赏
  • 举报
回复
拜托各位帮帮我
冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
我明白了,楼主稍候
geniusqing 2005-08-17
  • 打赏
  • 举报
回复
不是我想要的结果啊,我想要的结果如下:
id facid machinenumber number repairvalue sign
---- -------- ------------- ----------- ----------- ----
06 aaa 80# 100 140 是
07 bbb 90# 100 110 否
08 fff 60# 100 150 否

--查询2005-08-16的数据
select id,facid,machinenumber,repairvalue,number
from ta2 where repairvalue>number*1.0 and data='2005-08-16'
与该数据相同facid,machinenumber而且repairvalue>number*1.0的最大id的数据为

select b.id, A.facid,A.machinenumber,b.repairvalue,b.number
from ta2 A ,
(select max(id) id ,facid,machinenumber,repairvalue,number from ta2
where data<>'2005-08-16' and repairvalue>number*1.0
group by facid,machinenumber,repairvalue,number) B
where A.machinenumber=b.machinenumber and a.facid=b.facid and data='2005-08-16'
and a.repairvalue>a.number*1.0
则2005-08-16,相同facid,machinenumber而且repairvalue>number*1.0 的sign为是
xueguang 2005-08-17
  • 打赏
  • 举报
回复
--照你的思路写,不过把data<>'2005-08-16'改为data='2005-08-16',这样好像更满足你的意思
select id,facid,machinenumber,number,repairvalue,case when exists(
select b.id, a.facid,a.machinenumber,b.repairvalue,b.number
from ta2 a ,
(select max(id) id ,facid,machinenumber,repairvalue,number from ta2
where data='2005-08-16' and repairvalue>number*1.0
group by facid,machinenumber,repairvalue,number) b
where a.machinenumber=b.machinenumber and a.facid=b.facid and data='2005-08-16'
and a.repairvalue>a.number*1.0

) then '是' else '否' end sign from ta2 where repairvalue>number*1.0 and data='2005-08-16'

--结果
id facid machinenumber number repairvalue sign
---- -------- ------------- ----------- ----------- ----
06 aaa 80# 100 140 是
07 bbb 90# 100 110 是
08 fff 60# 100 150 是

(所影响的行数为 3 行)

冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
楼上的有点意思

可是你说了半天都没有说明白到底出现什么问题啊?
你指的是服务管理器马
dufeng16 2005-08-17
  • 打赏
  • 举报
回复
求救各位高人,帮帮我的忙.
我的SQL SERVER 服务器打不开了.
谁能帮我解决一下.我怎么搞都不行.
在线等着您的好消息.
谢谢各位帮忙了.
有分加的.
冷箫轻笛 2005-08-17
  • 打赏
  • 举报
回复
又见楼主哈
楼主的帖子都挺怪!:)

查询2005-08-16
想生成如下结果
id facid machinenumber number repairvalue sign
06 aaa 80# 140 100 是
07 bbb 90# 110 100 否
08 fff 60# 150 100 否

上面就是你想要的结果吗?
但是上面的数据并不能满足
“条件是:如果存在与2005-08-16查询结果相同facid,machinenumber最近而且repairvalue>number*1.0时sign为是”
这个条件阿!
geniusqing 2005-08-17
  • 打赏
  • 举报
回复
你的不对啊
--查询2005-08-16的数据
select id,facid,machinenumber,repairvalue,number
from ta2 where repairvalue>number*1.0 and data='2005-08-16'

--与2005-08-16相同facid,machinenumber而且repairvalue>number*1.0的最大id的数据

select b.id, A.facid,A.machinenumber,b.repairvalue,b.number
from ta2 A ,
(select max(id) id ,facid,machinenumber,repairvalue,number from ta2
where data<>'2005-08-16' and repairvalue>number*1.0
group by facid,machinenumber,repairvalue,number) B
where A.machinenumber=b.machinenumber and a.facid=b.facid and data='2005-08-16'
and a.repairvalue>a.number*1.0
--如果存在的话,sign为是,否则为否
geniusqing 2005-08-17
  • 打赏
  • 举报
回复
这样对了,第二种方法好理解些
xueguang 2005-08-16
  • 打赏
  • 举报
回复
--写的麻烦点
select id,facid,machinenumber,number,repairvalue,case when facid+machinenumber+convert(char(10),data,102) in(
select facid+max(machinenumber)+max(convert(char(10),data,102)) from ta2 where convert(char(10),data,102)='2005.08.16' group by facid) and repairvalue>number*1.0 then '是' else '否' end sign from ta2 where
facid+machinenumber+convert(char(10),data,102) in(
select facid+max(machinenumber)+max(convert(char(10),data,102)) from ta2 where convert(char(10),data,102)='2005.08.16' group by facid) and repairvalue>number*1.0

--结果
id facid machinenumber number repairvalue sign
---- -------- ------------- ----------- ----------- ----
06 aaa 80# 100 140 是
07 bbb 90# 100 110 是
08 fff 60# 100 150 是

(所影响的行数为 3 行)

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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