我正在计算给定日期处于给定状态的订单数。在示例数据中,订单状态是一个时间轴,仅当订单移至下一个状态时才会更新。
样本数据:
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处于“已填写”状态,而不再处于“已发送”状态。
答案 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')
将字符串文字转换为日期。