Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 根据结果对a列进行分组_Sql_Sql Server - Fatal编程技术网

Sql 根据结果对a列进行分组

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

我有一个基本问题:我试图用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
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