首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL条件案例

SQL条件案例
EN

Stack Overflow用户
提问于 2014-01-06 20:55:18
回答 3查看 2.5K关注 0票数 7

我有一个表,列出项目和有关这些项目的状态。问题是有些项目有多个不同的状态项。例如。

代码语言:javascript
复制
HOST          Status
1.1.1.1       PASS
1.1.1.1       FAIL
1.2.2.2       FAIL
1.2.3.3       PASS
1.4.2.1       FAIL
1.4.2.1       FAIL
1.1.4.4       NULL

我需要给每个资产返回一个状态。

主机状态1.1.1.1传递1.2.2.2失败1.2.3.3传递1.4.2.1失败1.1.4.4没有结果

我一直试图用to语句来完成这个任务,但是无法完全正确地完成它。条件是任何Pass +任何东西都是Pass,Fail+没有结果是失败,Null是无结果。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-01-06 21:05:46

尝试使用case语句将其转换为有序的结果并对其进行分组,最后,您需要将其转换回良好的、人类可读的答案:

代码语言:javascript
复制
with cte1 as (
  SELECT HOST,
         [statNum] = case
                      when Status like 'PASS' then 2
                      when Status like 'FAIL' then 1
                      else 0
                    end
  FROM table
)
SELECT HOST, case max(statNum) when 2 then 'PASS' when 1 then 'FAIL' else 'No Results' end
FROM cte1
GROUP BY HOST

注意:我使用了CTE语句,希望能使事情变得更清楚一些,但是所有事情都可以在一个SELECT中完成,如下所示:

代码语言:javascript
复制
SELECT HOST,
 [Status] = case max(case when Status like 'PASS' then 2 when Status like 'FAIL' then 1 else 0 end)
    when 2 then 'PASS'
    when 1 then 'FAIL'
    else 'No Result'
   end
FROM table
票数 4
EN

Stack Overflow用户

发布于 2014-01-06 21:05:56

您可以使用Max(Status)Group by Host来获取Distinct值:

代码语言:javascript
复制
Select host, coalesce(Max(status),'No results') status
From Table1
Group by host
Order by host

小提琴演示结果:

代码语言:javascript
复制
|    HOST |     STATUS |
|---------|------------|
| 1.1.1.1 |       PASS |
| 1.1.4.4 | No results |
| 1.2.2.2 |       FAIL |
| 1.2.3.3 |       PASS |
| 1.4.2.1 |       FAIL |

默认情况下,SQL server是不区分大小写的,如果您的服务器需要注意区分大小写,那么就使用lower()函数,如下所示:

代码语言:javascript
复制
Select host, coalesce(Max(Lower(status)),'No results') status
From Table1
Group by host
Order by host

小提琴演示

票数 2
EN

Stack Overflow用户

发布于 2014-01-06 21:09:03

代码语言:javascript
复制
WITH CTE( HOST, STATUSValue)
AS(
     SELECT HOST,
     CASE STATUS WHEN 'PASS' 1 ELSE 0 END AS StatusValue
     FROM Data
)

SELECT DISTINCT HOST,
  CASE ISNULL(GOOD.STATUSVALUE,-1) WHEN 1 THEN 'Pass' 
       ELSE CASE ISNULL( BAD.STATUSVALUE,-1) WHEN 0 Then 'Fail' Else 'No Results' END
  END AS Results
FROM DATA AS D
LEFT JOIN CTE AS GOOD
  ON GOOD.HOST = D.HOST
 AND GOOD.STATUSVALUE = 1
LEFT JOIN CTE AS BAD
  ON BAD.HOST = BAD.HOST
 AND BAD.STATUSVALUE = 0 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20959092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档