Sql 根据结果对a列进行分组
我有一个基本问题:我试图用SQL创建一个查询:Sql 根据结果对a列进行分组,sql,sql-server,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 是否可以从2016-06-07判断状态是否为“失败”,只打印一行失败状态。如果是finish ok,请打印finish ok。 我想要这个结果: 2016-06-07 FAILED
Select Date, Status From Table
我的结果是,比如说,
2016-06-07 FAILED
2016-06-07 FINISH OK
2016-07-07 FINISH OK
2016-07-07 FINISH OK
是否可以从2016-06-07判断状态是否为“失败”,只打印一行失败状态。如果是finish ok,请打印finish ok。
我想要这个结果:
2016-06-07 FAILED
2016-07-07 FINISH OK
谢谢
编辑:
我只有两种状态:失败和完成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
如果我在一个日期中有一个失败状态,我想打印“失败”,但如果我没有任何“失败”状态,我会打印“完成确定”,这样更好吗 您想按日期还是按状态分组
SELECT Date, Status FROM Table GROUP BY Date
或
如果有分组依据,还可以有一些摘要信息。你能再解释一下吗?使用带有条件否定的
案例
第一个COUNT
只是向您展示如何工作。这将统计每个日期组的失败次数
然后,下面的案例
检查是否有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
您可以将TOP 1与第_行编号的领带一起使用:
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
这应该起作用:
Select Date, MIN(Status)
From Table
Group By Date
虽然我使用的方法与上面相同,但我认为使用COUNT DISTINCT会更简单,如下所示:
SELECT date,
CASE WHEN COUNT( DISTINCT status)>1
THEN 'FAILED'
ELSE 'FINISH OK'
END AS status
FROM table
GROUP BY date
请为更多日期添加更多数据添加一些状态不同的日期,并告诉结果。谢谢你的帮助,我更新了帖子。这是否更好?这不起作用,如果需要选择这些选项,您需要同时按状态和日期分组。这将为两个值的数据生成两行。@JuanCarlosOropeza我已更新了我的答案,请检查,希望您会发现它更简单易懂。请改用MIN
,你希望失败
成为第一选择。也要工作!我以为MAX和MIN只是数字?当我们有字符串时,逻辑是什么?谢谢是一样的,但是使用字母顺序'A'<'B'
和'A'
谢谢@JuanCarlosOropezaI如果你只有两种状态,那么@MisterPositive是最简单的答案。但我的更通用,可以适应多种情况。好的,我理解。如果我需要您的解决方案,我可以添加越来越多的状态。谢谢超级的!它也在工作!最好用什么?您的结果或下面的结果(带有计数和一个案例)?您可能应该使用EXPLAIN
对其进行测试,我认为使用任何给定的解决方案都不会得到任何时间/性能差异。:)就我个人而言,我会选择MisterPositive建议的一个,简单的一个,但应该可以。通常,当您需要在某个日期获取F.e.first/last status时,会使用这种查询(它需要是一些表示行顺序的列,如datetime或identity)。如果您添加一些新的状态,例如可用的
,则更好地使用剩余解决方案将失败。
SELECT date,
CASE WHEN COUNT( DISTINCT status)>1
THEN 'FAILED'
ELSE 'FINISH OK'
END AS status
FROM table
GROUP BY date