等待每月SQL计数

时间:2015-02-05 18:02:17

标签: sql sql-server ssms

以下查询返回准确的信息,我只是没有运气试图做到这一点:

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    

...

有没有办法一次性获得这个?对不起,如果这是一个重复的主题,我看了一些董事会,他们帮助我得到了关闭计数..但使用两个日期字段之间的范围,我没有运气。

提前致谢

2 个答案:

答案 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 numberscalendar 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编写的。