2013-03-21 77 views
1

我需要一些幫助,因爲我卡住了。這是使用SQL和Coldfusion。 基本上我有一張表,列出了某些門票的完成情況以及他們被標記爲完整的日期。例如,該表具有在GROUP BY中使用的區域和區域。因此,我想要計算每年每週都完成的每張票,用戶選擇例如運行該報告。 我將列出我目前擁有的一些SQL。輸出一週中某些列的總和,一年中一週,一週的日期與日期一致

SELECT           
    SUM(CASE WHEN DATEPART(ww, completionDate) = 1 THEN 1 ELSE 0 END) AS [Jan1-7], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 2 THEN 1 ELSE 0 END) AS [Jan8-14], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 3 THEN 1 ELSE 0 END) AS [Jan15-21], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 4 THEN 1 ELSE 0 END) AS [Jan22-31]  
    SUM(CASE WHEN DATEPART(ww, completionDate) = 5 THEN 1 ELSE 0 END) AS [Feb1-7], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 6 THEN 1 ELSE 0 END) AS [Feb8-14], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 7 THEN 1 ELSE 0 END) AS [Feb15-21], 
    SUM(CASE WHEN DATEPART(ww, completionDate) = 8 THEN 1 ELSE 0 END) AS [Feb22-28], 

正如你所看到的,我基本上試圖抓住completionDate的一年中的哪一週,並且在它自己的列中求和。它應該採用這種格式,除非有人有更好的建議。 例如,2013年2月18日的問題是,SQL告訴我這將是2013年的第8周,而我的代碼將根據我的代碼在FEB15-21中得出結果,即第7周。 我需要的報表是在頂部標題中顯示月份,然後在每個月的下一個標題中顯示每週,然後基本完成該周內完成的每張票的計數。所以周/月需要成爲專欄。

我已經閱讀了一些CF函數和所有,但只是不知道如何利用它們來獲得我所需要的。 有沒有一種方法可以動態地求和這些日期,以確保它們在基於星期的正確列中爲SUMMED,或使用Coldfusion來處理這部分?但是我對ColdFusion部分也不太確定,所以如果可能的話,任何關於使用SQL或CF的建議,或許可以幫助我完成代碼部分,我都會非常感激。

謝謝!

+2

Jan22-31怎麼可能是一週,這是9天.... – ljh 2013-03-21 06:22:20

+0

爲什麼你的周不是實際的星期? – 2013-03-21 13:12:50

+0

請參閱[此問題]的答案(http://stackoverflow.com/questions/15515679/select-with-count-for-years/15515954#15515954)。這個答案是基於按月收集日期,但它很容易適應幾周(或幾天或幾小時等)。 – 2013-03-21 04:51:35

回答

0

我建議創建一個數據庫表,其中主鍵是日期。此表中的其他字段將包括星期字符串(1月7日至13日)以及您需要的其他任何內容,節假日,財政信息等。

您需要一些維護腳本來處理某些事情,並且您可能必須手動執行假期部分。這就是我們對數據倉庫所做的。

它使您正在嘗試的報告非常簡單。

0

我不是100%確定我是正確的,但爲什麼不給這個查詢一槍。這將計算每週/每月組合的頻率,使您可以根據輸出期望將其按周或月分解。然後可以使用CF邏輯來確定輸出目的的限制日期。

SELECT 

    -- Get the week and month of each row 
    MONTH(completionDate) AS monthOfYear, 
    WEEK(completionDate) AS weekOfYear, 

    -- Count how many rows are in this group 
    COUNT(*) AS frequency 

FROM yourTable AS yt 

-- If you are only interested in a specific date range, chuck in something like this 
WHERE yt.completionDate BETWEEN DATE('2013-01-01') AND ('2013-12-30') 

-- Order by month and then week, so that week 4 in Jan comes before week 4 in Feb 
GROUP BY 
    monthOfYear ASC, 
    weekOfYear ASC 

希望這是幫助,如果這是不太那種你腦子裏請澄清問題的事情。

如果這是一個非常大的表,你在白天統計的結束只是感興趣,然後再考慮運行後每天像下面這樣了一張桌子,一個簡單的結構statsDate DATE NOT NULL PKstatsFrequency INTEGER UNSIGNED NOT NULL

INSERT INTO yourStatsTable(
    statsDate, 
    statsFrequency 
) 
SELECT 
    DATE(completionDate), 
    COUNT(*) 
FROM yourTable AS yt 
WHERE yt.completionDate >= SUBDATE(CURRENT_DATE,1) 
AND yt.completionDate < CURRENT_DATE 
ON DUPLICATE KEY UPDATE statsFrequency = VALUES(statsFrequency) 

然後這會給你一個前幾天的表,可以查詢沒有擊中主表(但如果它是一個大/忙的表,並且在飛行中生成它們時不會生存的話,這隻會做)

0

我認爲令你困惑的部分是MSSQL如何對待我們ek數字。他們都是星期一到星期的格式。本週的第1周開始於2012年12月31日星期一至2013年6月1日星期日(,而不是2013年1月1日至2013年7月7日,假設爲),第2周:1/7/13日至2013年1月13日,等等... 2013年2月18日是一年中的第八週,因爲它從第八週(星期一)開始。

你要使用這樣的:

DATEADD(ww, DATEDIFF(ww,0,completionDate), 0) AS [Start Of Week], 
DATEADD(s,-1,DATEADD(ww, DATEDIFF(ww,0,GETDATE())+1,0)) as [End Of Week] 

得到的開始和結束日期,並通過條款和求和使用它你的小組。

但是,要匹配您的代碼,您可以將偏移天數添加到[Start Of Week]和[End Of Week]以獲取您的範圍。在2013年,該抵消將爲1天截至2013年1月1日(人類年初) - 2012年12月31日(年初sql開始)。日期將與您的[1月1日 - 7日]星期格式相匹配。

希望這會有所幫助。 -Minh

相關問題