2011-05-10 60 views
2

我有如下表SQL組重複計數

User ID Start Date End Date 
------------------------------------- 
John Doe Mar 11 2011 May 28 2011 
Robret S Mar 21 2011 Jun 29 2011 
Tina T  Feb 01 2011 August 20 2011 

我想告訴我有多少人可以在過去的6個月,即使當月沒有人。這怎麼可能。我知道我必須分組並使用不同的計數。

預期輸出:

February = 1 Resource 
March  = 3 Resources 
April  = 3 Resources 
May  = 3 Resources 
June  = 2 Resources 
July  = 1 Resource 
August = 1 Resource 
+1

這不是我清楚你的要求。你能否發佈更多樣本數據和預期產出? – 2011-05-10 01:49:37

回答

0

您將需要現有的數據記錄在過去6個月,這樣就可以合併這兩個數據集。您可以在CTE中生成最近6個月,並與您的數據左連接。即使您沒有數據,也可以顯示過去6個月。

0

我不認爲你可以使用「簡單」選擇語句來做你想做的事(甚至使用GROUPING等)。下面是我的頭頂,所以你必須嘗試一下,最好閱讀Joe Celko的優秀書籍SQL for Smarties

您需要創建第二個包含所有月份(開始/結束日期)的表格。您只需要爲所有類型相似的查詢的一個表,它必須包含所有月份的日期範圍您感興趣的查詢:

CREATE TABLE months (id, start DATE, end DATE); 

INSERT INTO months (id, start, end) 
      values ((1, 2011-01-01, 2011-01-31), 
        (2, 2011-02-01, 2011-02-28), ...); 

然後您LEFT OUTER從您的用戶表連接到這個月表。這將給你每個用戶每個月他們可用的行,你可以根據需要進行GROUP:

SELECT months.id, COUNT(user.id) 
    FROM months LEFT OUTER JOIN users 
     ON user.start_date < months.end 
     AND user.end_date > months.start 
GROUP BY months.id; 

希望有所幫助。

2
With Calendar As 
    (
    Select Cast('20110501' As DateTime) As [Date] 
    Union All 
    Select DateAdd(m,-1,[Date]) 
    From Calendar 
    Where [Date] > DateAdd(m,-5,'20110501') 
    ) 
Select DateName(m, C.Date) + ' ' + Cast(Year(C.Date) As char(4)) 
    , Case Count(*) 
     When 1 Then Cast(Count(*) As varchar(10)) + ' Resource' 
     Else Cast(Count(*) As varchar(10)) + ' Resources' 
     End 
From Calendar As C 
    Left Join MyTable As T 
     On C.Date Between T.StartDate And T.EndDate 
Group By C.Date 

結果:

 
December 2010 | 1 Resource 
January 2011 | 1 Resource 
February 2011 | 1 Resource 
March 2011  | 1 Resource 
April 2011  | 3 Resources 
May 2011  | 3 Resources 
0
WITH resources AS (
    SELECT 
    Date = DATEADD(month, v.number, [Start Date]) 
    FROM atable t 
    INNER JOIN master.dbo.spt_values v ON v.type = 'P' 
     AND v.number BETWEEN 0 AND DATEDIFF(month, t.[Start Date], t.[End Date]) 
) 
SELECT 
    Month = DATENAME(month, Date), 
    ResourceCount = CAST(COUNT(*) AS varchar(30)) + 
        CASE COUNT(*) WHEN 1 THEN ' Resource' ELSE ' Resources' END 
FROM resources 
WHERE Date > DATEADD(month, -6, DATEADD(day, -DAY(GETDATE()), GETDATE())) 
GROUP BY YEAR(Date), MONTH(Date), DATENAME(month, Date) 
ORDER BY YEAR(Date), MONTH(Date)