我有一个T-SQL报价表,需要能够统计过去几个月中处于打开状态的报价。
我需要处理的日期是' Add_Date
'时间戳和' Update_Date
'时间戳。一旦将引号放入Closed_Status
“ 1
”中,就无法再更新。因此,“ Update_Date
”实际上成为Closed_Status
时间戳。
我被困住了,因为我不知道如何选择在特定月份内打开的所有开放报价。
这是一些示例记录:
Quote_No Add_Date Update_Date Open_Status Closed_Status
001 01-01-2016 NULL 1 0
002 01-01-2016 3-1-2016 0 1
003 01-01-2016 4-1-2016 0 1
理想的结果将是:
Year Month Open_Quote_Count
2016 01 3
2016 02 3
2016 03 2
2016 04 1
我在这上面碰到了心理障碍,我尝试进行一些case when
过滤,但是我似乎无法弄清楚这个难题。理想情况下,我不会对日期进行硬编码,因为它跨越了数年之久,而且我不想在编写后就维护它。
预先感谢您的帮助。
您正在按月执行此操作。因此,想到了三个选择:
left join
。让我展示最后一个:
with n as (
select row_number() over (order by (select null)) - 1 as n
from master..spt_values
)
select format(dateadd(month, n.n, q.add_date), 'yyyy-MM') as yyyymm,
count(*) as Open_Quote_Count
from quotes q join
n
on (closed_status = 1 and dateadd(month, n.n, q.add_date) <= q.update_date) or
(closed_status = 0 and dateadd(month, n.n, q.add_date) <= getdate())
group by format(dateadd(month, n.n, q.add_date), 'yyyy-MM')
order by yyyymm;
这确实假设每个月至少有一个未完成的记录。为此目的,这似乎是合理的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句