2015-02-05 140 views
0

下面的查询返回准确的信息,我只是还没有任何运气试图使这个:待定每月SQL计数

1)更多动态的,所以我不会每个月都

重复相同的代码行

2)格式不同,因此需要短短2个月+年列由字段1 +场2

示例代码来查看待计数(基本上,和当(OPEN日期前/上月的最后一天)和(关闭日期在月份之后或它仍然打开)

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  

...

有没有办法一次性得到这个?对不起,如果这是一个重复的话题,我已经看了一些董事会,他们帮助我得到了结算......但使用两个日期字段之间的范围,我没有任何运气。提前

感谢

+1

您可以添加更多示例输入和所需输出吗?并生成一个'sqlfiddle.com'demo? – 2015-02-05 18:10:39

回答

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

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里,如果你需要有同样的事情计入几个月,那将是更困难,你可能需要一个日历“表”,你必须交叉使用这个数据。