SQL统计状态文本并根据日期更改某些状态文本(及其计数)

SQL统计状态文本并根据日期更改某些状态文本(及其计数),sql,sql-server,Sql,Sql Server,花了一段时间寻找这个问题,但没有找到解决方案。问题是:在一列中获取状态值的计数。到目前为止非常简单,但是当DueDate(可以为空)基于当前日期过期且未完成时,我还想更改/忽略其中一些。还包括状态的空字符串。示例数据(请原谅日期显示为文本…假设它是SQL日期类型-只是想让它更具可读性): 数据库表中的数据DispatchStatus Status Due Date ======================================= Complete Mar 1

花了一段时间寻找这个问题,但没有找到解决方案。问题是:在一列中获取状态值的计数。到目前为止非常简单,但是当DueDate(可以为空)基于当前日期过期且未完成时,我还想更改/忽略其中一些。还包括状态的空字符串。示例数据(请原谅日期显示为文本…假设它是SQL日期类型-只是想让它更具可读性):

数据库表中的数据
DispatchStatus

Status        Due Date
=======================================
Complete      Mar 1, 2015                  <-- would not be Late since Complete
Complete      null
Complete      July 12, 2016
Complete      July 16, 2016
Started       Mar 3, 2017
Started       null
Started       Feb 9, 2015                   <-- Late
OnDevice      June, 2016
OnDevice      Dec 3, 2015                   <-- Late
Dispatched    Nov 16, 2015                  <-- Late
Dispatched    null
Dispatched    Nov 20, 2016
              Nov 15, 2017
              null
              Jan 15, 2016                  <-- Late

谢谢

大小写
表达式与
计数
一起使用:

DECLARE @currentDate DATE = '20160404'

SELECT
    Status =
        CASE 
            WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
            ELSE Status
        END,
    COUNT(*)
FROM DispatchStatus
GROUP BY
    CASE 
        WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
        ELSE Status
    END
DECLARE@currentDate='20160404'
挑选
地位=
案例

当DueDate与
计数一起使用
大小写
表达式时:

DECLARE @currentDate DATE = '20160404'

SELECT
    Status =
        CASE 
            WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
            ELSE Status
        END,
    COUNT(*)
FROM DispatchStatus
GROUP BY
    CASE 
        WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
        ELSE Status
    END
DECLARE@currentDate='20160404'
挑选
地位=
案例

截止日期2015年11月16日
的发送时间有多晚?我在这里只看到一个迟到的。现在就修好了。谢谢2015年11月16日晚了,
怎么发送?我在这里只看到一个迟到的。现在就修好了。谢谢谢谢你是对的,我想把今天的日期写在里面。还有一个问题——现实世界中的场景还包括一个相当大的where子句(用于过滤列表)。这会不会被附加到When条款上?让你知道这是怎么回事。谢谢你,我想是的。试试看,让我知道它是怎么回事。看起来真的很好!从“发件人”和“组”之间滑出“位置”。我必须扩展数据,但我想我已经做到了。再次感谢你的帮助-节省了我的时间。没问题。很高兴我能帮忙。谢谢!你是对的,我想把今天的日期写在里面。还有一个问题——现实世界中的场景还包括一个相当大的where子句(用于过滤列表)。这会不会被附加到When条款上?让你知道这是怎么回事。谢谢你,我想是的。试试看,让我知道它是怎么回事。看起来真的很好!从“发件人”和“组”之间滑出“位置”。我必须扩展数据,但我想我已经做到了。再次感谢你的帮助-节省了我的时间。没问题。很高兴我能帮忙。
DECLARE @currentDate DATE = '20160404'

SELECT
    Status =
        CASE 
            WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
            ELSE Status
        END,
    COUNT(*)
FROM DispatchStatus
GROUP BY
    CASE 
        WHEN DueDate <= @currentDate AND ISNULL(Status, '') <> 'Complete' THEN 'Late'
        ELSE Status
    END