以下查询返回准确的信息,我只是没有运气试图做到这一点:
1)更具活力,所以我不是每个月都重复相同的代码行
2)格式不同,因此只需要2个月的月份+年来按字段1 +字段2查看待处理的计数
示例代码(基本上,当(OPEN日期在月的最后一天之前/之后)和(CLOSE日期在月之后或它仍然打开时)之和
SELECT
SUM(CAST(case when OPENDATE <= '2014-11-30 23:59:59'
and ((CLOSED >= '2014-12-01')
or (CLOSED is null)) then '1' else '0' end as int)) Nov14
,SUM(CAST(case when OPENDATE <= '2014-12-31 23:59:59'
and ((CLOSED >= '2015-01-01')
or (CLOSED is null)) then '1' else '0' end as int)) Dec14
,SUM(CAST(case when OPENDATE <= '2015-01-30 23:59:59'
and ((CLOSED >= '2015-02-01')
or (CLOSED is null)) then '1' else '0' end as int)) Jan15
,FIELD1,FIELD2
FROM T
GROUP BY FIELD1,FIELD2
结果:
FIELD1 FIELD2 NOV14 DEC14 JAN15
A A 2 5 7
A B 6 8 4
C A 5 6 5
...
而不是:
COUNT FIELD1 FIELD2 MO YR
14 A A 12 2014
18 A B 12 2014
16 C A 1 2015
...
有没有办法一次性获得这个?对不起,如果这是一个重复的主题,我看了一些董事会,他们帮助我得到了关闭计数..但使用两个日期字段之间的范围,我没有运气。
提前致谢
答案 0 :(得分:0)
像这样:
SELECT
FIELD1,FIELD2,datepart(month, OPENDATE), datepart(year, OPENDATE), sum(1)
FROM T
GROUP BY FIELD1,FIELD2, datepart(month, OPENDATE), datepart(year, OPENDATE)
但这当然只是基于OPENDATE,如果你需要在几个月内计算相同的东西,那将会更加困难,你可能需要一个日历“桌子”,你将不得不交叉应用此数据。
答案 1 :(得分:0)
一种方法是使用table of numbers或calendar table。
在下面的代码中,表Numbers
有一列Number
,其中包含从1开始的整数。generate such table有很多种方法。
您可以动态执行,也可以使用实际表格。我个人在数据库中有这样的表,有100,000行。
第一个CROSS APPLY
有效地创建了一个列CurrentMonth
,因此我不必多次重复调用DATEADD
。
第二个CROSS APPLY
是您希望每个月运行的查询。它可以根据需要复杂化,如果需要,它可以返回多行。
-- Start and end dates should be the first day of the month
DECLARE @StartDate date = '20141201';
DECLARE @EndDate date = '20150201';
SELECT
CurrentMonth
,FIELD1
,FIELD2
,Counts
FROM
Numbers
CROSS APPLY
(
SELECT DATEADD(month, Numbers.Number-1, @StartDate) AS CurrentMonth
) AS CA_Month
CROSS APPLY
(
SELECT
FIELD1
,FIELD2
,COUNT(*) AS Counts
FROM T
WHERE
OPENDATE < CurrentMonth
AND (CLOSED >= CurrentMonth OR CLOSED IS NULL)
GROUP BY
FIELD1
,FIELD2
) AS CA
WHERE
Numbers.Number < DATEDIFF(month, @StartDate, @EndDate) + 1
;
如果您提供包含样本数据和预期输出的表格,我可以验证查询是否产生正确的结果。
该解决方案是用SQL Server 2008编写的。