2015-02-05 141 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裏,如果你需要有同樣的事情計入幾個月,那將是更困難,你可能需要一個日曆「表」,你必須交叉使用這個數據。