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