SQL条件案例

时间:2014-01-06 20:55:19

标签: sql sql-server tsql case distinct-values

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

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

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

HOST          Status
1.1.1.1       PASS
1.2.2.2       FAIL
1.2.3.3       PASS
1.4.2.1       FAIL
1.1.4.4         No Results

我一直在尝试使用T-SQL Case语句执行此操作但不能完全正确。 条件是任何Pass +任何是Pass,Fail + No Results是失败,Null是No Results。

3 个答案:

答案 0 :(得分:4)

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

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中完成,如下所示:

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

答案 1 :(得分:2)

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

Select host, coalesce(Max(status),'No results') status
From Table1
Group by host
Order by host

<强> Fiddle Demo Results:

|    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()函数,如下所示:

Select host, coalesce(Max(Lower(status)),'No results') status
From Table1
Group by host
Order by host

<强> Fiddle demo

答案 2 :(得分:0)

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