对列进行分组取决于结果

时间:2016-10-14 14:00:24

标签: sql sql-server

我有一个基本问题:我尝试在SQL中创建一个查询:

Select Date, Status From Table

我的结果是,例如,

2016-06-07   FAILED
2016-06-07   FINISH OK 
2016-07-07   FINISH OK
2016-07-07   FINISH OK

是否可以判断状态是否为“FAILED'从2016-06-07,只打印一行失败状态。如果它刚刚完成,打印完成就可以了。 我想要这个结果:

2016-06-07   FAILED
2016-07-07   FINISH OK

谢谢,

编辑: 我只有2个状态:FAILED和FINISH OK

越来越多的日期和结果:

2016-06-07   FAILED
2016-06-07   FINISH OK
2016-06-07   FINISH OK
2016-06-07   FINISH OK
2016-06-07   FINISH OK

 2016-07-07   FINISH OK
 2016-07-07   FINISH OK
 2016-07-07   FINISH OK
 2016-07-07   FINISH OK
 2016-07-07   FINISH OK

2016-07-08    FINISH OK
2016-07-08    FINISH OK
2016-07-08    FINISH OK
2016-07-08    FAILED
2016-07-08    FINISH OK

我想:

2016-06-07   FAILED
2016-07-07   FINISH OK
2016-07-08   FAILED

如果我在某个日期有一个失败状态,我想打印“失败”,但如果我没有任何“失败”状态。状态,我打印'完成确定',它更好吗?

5 个答案:

答案 0 :(得分:5)

使用CASE条件聚合。

第一个COUNT只是为了向您展示如何工作。这将计算每个日期组的失败次数。

然后以下CASE检查是否有1个或更多失败

 SELECT Date,
        COUNT(CASE WHEN Status = 'FAILED' THEN 1 END) as total_fails,           
        CASE WHEN Count(CASE WHEN Status = 'FAILED' THEN 1 END) > 0 
             THEN 'FAILED'
             ELSE 'FINISH OK'
        END as Status 
FROM Table
GROUP BY Date

答案 1 :(得分:4)

这应该有效:

Select Date, MIN(Status) 
From Table 
Group By Date

答案 2 :(得分:3)

你可以使用TOP 1 WITH TIES和ROW_NUMBER:

SELECT TOP 1 WITH TIES  
                    [Date], 
                    [Status] 
From [Table]
ORDER BY ROW_NUMBER() OVER (PARTITION BY [Date] ORDER BY [Status] ASC)

输出:

Date        Status
2016-06-07  FAILED
2016-07-07  FINISH OK
2016-07-08  FAILED

答案 3 :(得分:1)

虽然我使用与上面相同的方法,但我认为使用COUNT DISTINCT可以更简单,如下所示:

SELECT date, 
    CASE WHEN COUNT( DISTINCT status)>1 
         THEN 'FAILED' 
         ELSE 'FINISH OK' 
    END AS status
FROM table
GROUP BY date

答案 4 :(得分:-1)

您想按日期或状态进行分组吗?

SELECT Date, Status FROM Table GROUP BY Status

BleGattException

如果您有分组,则还可以获得一些摘要信息。你能解释一下吗?