计算给定日期处于某种状态的项目数

时间:2018-11-15 18:06:58

标签: sql sql-server-2014

我正在计算给定日期处于给定状态的订单数。在示例数据中,订单状态是一个时间轴,仅当订单移至下一个状态时才会更新。

样本数据:

Order_ID    Status     Status_Date
--------    ------     -----------------------
56845       NEW        2012-09-11 11:52:20.000
56845       SENT       2012-09-12 00:22:13.000
56845       ACK        2012-09-17 08:14:33.000
56845       FILL       2012-09-20 14:32:00.000
36968       NEW        2012-09-08 11:52:20.000
36968       SENT       2012-09-15 00:22:13.000
36968       ACK        2012-09-22 08:14:33.000
48258       NEW        2012-09-14 11:52:20.000
48258       SENT       2012-09-20 00:22:13.000
48258       ACK        2012-09-22 08:14:33.000
48258       FILL       2012-09-28 23:22:46.000
48258       SHIP       2012-09-29 18:54:22.000

我的困难是我需要为每个订单选择少于特定日期输入的最后一行,并在其处于特定状态时对其进行计数。

因此,如果我使用状态='SENT'且日期为午夜9/12/2018,我想返回订单号56845和36968。如果我使用状态='SENT'和日期为2018年9月21日午夜,我想返回订单号36968和48258,因为订单号56845处于“已填写”状态,而不再处于“已发送”状态。

3 个答案:

答案 0 :(得分:0)

select count(*) from(select order_id,status from table group by order_id having max(status_date) <= '2012-09-16' or max(status_date) = '2012-09-21' and status ='SENT' ) 这就是您要寻找的,这意味着,如果在每个订单的最大状态日期,如果项目状态没有变化,或者直到最大日期小于您的日期才发送,则得到正确的结果。

答案 1 :(得分:-1)

您可以在1个以下使用

select count(1) from table_name where status='NEW' group by Status_Date

或者您可以使用此数字获取所有日期中所有状态的计数

select count(1) as count,Status,left(Status_Date,10) as Status_Date   from table_name 
group by Status,left(Status_Date,10)

答案 2 :(得分:-1)

如果您想要这样一个特定的计数器:

SELECT COUNT(*) AS counter FROM orders WHERE Status = 'SENT' and Status_Date <= '2012-09-16 23:59:59.000'


SELECT COUNT(*) AS counter FROM orders WHERE Status = 'SENT' and Status_Date <= Convert(datetime, '2012-09-16 23:59:59.000')

将字符串文字转换为日期。