2010-06-22 162 views
1

我有一個存儲文檔信息(DocID,名稱,類型,所有者等)的數據庫表。然後我有另一個表格來存儲文檔被下載的時間(DocID,DownloadTime等)。我正在設置一個頁面,用於記錄不同種類的文檔(策略,表單,出版物等)在特定的月份和年份中獲得的點擊次數(我爲每個用戶選擇了一個下拉列表)。例如,我也希望能夠將月份或年份留空,因此用戶可以在一年內獲得所有月份的點擊次數。下面的查詢在用戶選擇月份和年份時正常工作。但是,如果將月份或年份留空,則gridview不會顯示分組的文檔類型。例如,如果我想看看命中爲2010年1月,我得到:不按日期分組?

Policies : 210 hits 
Forms: 98 hits 

但是,當用戶選擇所有月份到2010年,用戶將獲得:

Policies: 210 hits 
Policies: 87 hits 
Policies: 23 hits 
Policies: 87 hits 
Forms 

所以我得到了不同行的所有月份,但沒有分組爲一種。查詢錯在哪裏?

SELECT COUNT(Counter.DocID) AS Counter, 
     Doc.DocType, 
     MONTH(Counter.DownloadDate) AS MonthDownload, 
     YEAR(Counter.DownloadDate) AS YearDownload 
    FROM Counter 
     INNER JOIN Doc ON Counter.DocID = Doc.DocID 
GROUP BY Doc.DocType, 
     MONTH(Counter.DownloadDate), 
     YEAR(Counter.DownloadDate) 
HAVING (MONTH(Counter.DownloadDate) = @Month1 OR @Month1 IS NULL) AND 
     (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL) 

回答

2

問題出在您的GROUP BY子句中。

如果你說GROUP BY的DocType,月,年,這意味着任何時候那些任何是不同於他人,分別指望他們。

您需要做的是GROUP BY僅限於年份如果您希望全年的總數,以及按月份,年份的總數,如果您希望每年每個月的計數。

+0

4秒打我! – 2010-06-22 14:53:11

+0

不應該花你的時間編輯這個問題:P – 2010-06-22 14:53:52

+0

嗯,你比我能說的更快,謝謝你。 – netNewbi3 2010-06-22 15:04:10

0

當你想要的年度累積,你必須在幾個月使用不同的查詢不組 - 或你必須進行後處理的結果,從年內不同月份加起來計數。

按照書面的說法,您的代碼總是按月份和年份分組,在月份更改時生成新的行 - 在沒有違反SQL中的每條規則(好的,我誇大了 - 很多規則)的情況下,它不能做其他事情。

0

從查詢中刪除相關一個月分組得到給定年份每個文件類型一個聚合記錄。

SELECT COUNT(Counter.DocID) AS Counter, 
     Doc.DocType, 
     YEAR(Counter.DownloadDate) AS YearDownload 
    FROM Counter 
     INNER JOIN Doc ON Counter.DocID = Doc.DocID 
GROUP BY Doc.DocType, 
     YEAR(Counter.DownloadDate) 
HAVING 
     (YEAR(Counter.DownloadDate) = @Year1 OR @Year1 IS NULL)