我有一个表,列出项目和有关这些项目的状态。问题是有些项目有多个不同的状态项。例如。
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是无结果。
发布于 2014-01-06 21:05:46
尝试使用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发布于 2014-01-06 21:05:56
您可以使用Max(Status)和Group by Host来获取Distinct值:
Select host, coalesce(Max(status),'No results') status
From Table1
Group by host
Order by host小提琴演示结果:
| 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小提琴演示
发布于 2014-01-06 21:09:03
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 https://stackoverflow.com/questions/20959092
复制相似问题