2013-07-11 70 views
0

這確實讓我感到困惑,但也許答案只是隱藏在明顯的視野中,我看不到討厭的肛交。但是,再次,我不是DBA,而是試圖學習如何編寫更復雜的SQL,將數月的記錄向上滾動,而不是拉動數千條記錄。這樣我就可以在後端彙總這些數據,以減輕客戶的負擔。每月按月滾動數據

我想從數據庫中選擇數年的數據,並將每個月的數據彙總到單獨的表中自己的記錄中。這意味着我最多應該有12個月的12個記錄,這是我選擇的年數。

這在我看來很簡單,我選擇一個日期範圍,並按月使用DATEPART(MM,)。然後,我使用簡單的COUNT(),AVG()和ETC函數將該數據彙總到case語句之外的月份。

但是,這並不是很好。那麼,您如何選擇一系列數據,按月將多個列彙總到一條記錄中,並在一條select語句中查看多年的數據?我可以用一個簡單的總結一個月的選擇語句來做到這一點,而不是每年的每個月*我想要回溯的年數。

示例

此代碼完成我想要的任何操作。只需要使這一點能夠在今年的每個月都做同樣的事*我想申請的年數。

DECLARE @StartDate Date='2013-01-01' 
DECLARE @EndDate Date='2013-02-01' 

SELECT @Name, 
    @StartDate, 
    COUNT(a.[CODE]), 
    SUM(a.[TICKETS]), 
    AVG(a.[TICKETS]), 
    COUNT(CASE WHEN a.[FLAG1] = 'A' THEN 1 ELSE NULL END), 
    COUNT(CASE WHEN a.[FLAG1] = 'B' THEN 1 ELSE NULL END), 
    COUNT(CASE WHEN a.[FLAG1] IS NULL THEN 1 ELSE NULL END) 
FROM [SOMETABLE] a 
WHERE a.[CODE] = @Name 
AND a.[DATE] >= @StartDate 
AND a.[DATE] < @EndDate 

回答

0

有點像;編輯以反映使用每個月的首日期的要求:

DECLARE @StartDate Date='2013-01-01' 
DECLARE @EndDate Date='2013-02-01' 

SELECT @Name, 
    DATEADD(month, DATEDIFF(MONTH, 0, a.[date]),0), 
    COUNT(a.[CODE]), 
    SUM(a.[TICKETS]), 
    AVG(a.[TICKETS]), 
    COUNT(CASE WHEN a.[FLAG1] = 'A' THEN 1 ELSE NULL END), 
    COUNT(CASE WHEN a.[FLAG1] = 'B' THEN 1 ELSE NULL END), 
    COUNT(CASE WHEN a.[FLAG1] IS NULL THEN 1 ELSE NULL END) 
FROM [SOMETABLE] a 
WHERE a.[CODE] = @Name 
AND a.[DATE] >= @StartDate 
AND a.[DATE] < @EndDate 
GROUP BY DATEADD(month, DATEDIFF(MONTH, 0, a.[date]),0) 
+0

謝謝!這很有效。我只需要修正@StartDate,它將拉出月份的第一天,而不是在每個記錄中放入「2013-01-01」。但我可以處理。 再次感謝您指出與GROUP BY顯而易見。 – Fastidious

+0

我剛編輯它;如果有幫助,請務必將其標記爲正確的答案。 –

+0

看起來不錯。現在,我只是想了解這些功能如何以這種方式工作。用DATEPART選擇月份和年份的另一種方法在我的結尾很容易理解。但是,感謝您的額外幫助。 現在開始喜歡玩數據。 – Fastidious