与其它列对比,null值处理 得出状态

__小龙虾__ 2017-07-08 12:54:13

现在要结果如下
低限 设备ID 当前采集值 严重低报警界限 低报警界限 高报警界限 严重高报警界限
ID EID CurrValue LLowAlarm LowAlarm HighAlarm HHighAlarm
1 1 11 10 null null null
2 1 11 null 20 null null
3 2 301 10 null 300 null
4 1 10001 10 null null 1000
5 2 5 10 40 500 null
6 1 11 null 10 null null
7 1 536 10 30 null null


1.拿当前采集值去跟这几个限制值做比对得出状态
2.这几个限制值有可能某些没有设置 即为null


现在要结果如下
低限 设备ID 当前采集值 严重低报警界限 低报警界限 高报警界限 严重高报警界限 状态
ID EID CurrValue LLowAlarm LowAlarm HighAlarm HHighAlarm status
1 1 11 10 null null null 正常
2 1 11 null 20 null null 低报警
3 2 301 10 null 300 null 高报警
4 1 10001 10 null null 1000 严重高报警
5 2 5 10 40 500 null 严重低报警
6 1 11 null 10 null null 正常
7 1 536 10 30 null null 正常



...全文
148 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
runrun2 2017-07-10
  • 打赏
  • 举报
回复
发个刚刚
二月十六 版主 2017-07-08
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([ID] int,[EID] int,[CurrValue] int,[LLowAlarm] int,[LowAlarm] int,[HighAlarm] int,[HHighAlarm] int)
Insert #T
select 1,1,11,10,null,null,null union all
select 2,1,11,null,20,null,null union all
select 3,2,301,10,null,300,null union all
select 4,1,10001,10,null,null,1000 union all
select 5,2,5,10,40,500,null union all
select 6,1,11,null,10,null,null union all
select 7,1,536,10,30,null,null
Go
--测试数据结束
SELECT * ,
CASE WHEN [CurrValue] >= [HHighAlarm]
AND [HHighAlarm] IS NOT NULL THEN '严重高报警'
WHEN [CurrValue] >= [HighAlarm]
AND [HighAlarm] IS NOT NULL THEN '高报警'
WHEN [CurrValue] <= [LLowAlarm]
AND [LLowAlarm] IS NOT NULL THEN '严重低报警'
WHEN [CurrValue] <= [LowAlarm]
AND [LowAlarm] IS NOT NULL THEN '低报警'
ELSE '正常'
END AS 状态
FROM #T


__小龙虾__ 2017-07-08
  • 打赏
  • 举报
回复
引用 2 楼 sinat_28984567 的回复:
额,楼主这个CurrValue和其他几列比较的规则是什么? 这两列一个是CurrValue比所有的都高,一个是CurrValue比所有的都低,但是都得到结果了,看不太明白 4 1 10001 10 null null 1000 严重高报警 5 2 5 10 40 500 null 严重低报警
引用 3 楼 jia584256254 的回复:
with a(ID,EID,CurrValue,LLowAlarm,LowAlarm,HighAlarm,HHighAlarm)as (select '1','1',11,10,null,null,null union all select '2','1',11,null,20,null,null union all select '3','2',301,10,null,300,null union all select '4','1',10001,10,null,null,1000 union all select '5','2',5,10,40,500,null union all select '6','1',11,null,10,null,null union all select '7','1',536,10,30,null,null) select * ,case when currvalue <isnull(LLowAlarm,0) then '严重低报警' when currvalue <isnull(LowAlarm,0) then '低报警' when currvalue >isnull(HHighAlarm,1000000) then '严重高报警' when currvalue >isnull(HighAlarm,1000000) then '高报警' else '正常' end as status from a
你这个到是满足需求 但是有漏洞
jia584256254 2017-07-08
  • 打赏
  • 举报
回复
with a(ID,EID,CurrValue,LLowAlarm,LowAlarm,HighAlarm,HHighAlarm)as (select '1','1',11,10,null,null,null union all select '2','1',11,null,20,null,null union all select '3','2',301,10,null,300,null union all select '4','1',10001,10,null,null,1000 union all select '5','2',5,10,40,500,null union all select '6','1',11,null,10,null,null union all select '7','1',536,10,30,null,null) select * ,case when currvalue <isnull(LLowAlarm,0) then '严重低报警' when currvalue <isnull(LowAlarm,0) then '低报警' when currvalue >isnull(HHighAlarm,1000000) then '严重高报警' when currvalue >isnull(HighAlarm,1000000) then '高报警' else '正常' end as status from a
二月十六 版主 2017-07-08
  • 打赏
  • 举报
回复
额,楼主这个CurrValue和其他几列比较的规则是什么? 这两列一个是CurrValue比所有的都高,一个是CurrValue比所有的都低,但是都得到结果了,看不太明白 4 1 10001 10 null null 1000 严重高报警 5 2 5 10 40 500 null 严重低报警
  • 打赏
  • 举报
回复
select *,case when isnull(LLowAlarm,0)!=0 then '严重低报警' when isnull(LowAlarm,0)!=0 then '低报警界限' when isnull(HighAlarm,0)!=0 then '高报警界限' when isnull(HHighAlarm,0)!=0 then '严重高报警界限' end from tb

34,576

社区成员

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

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