2010-06-22 128 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)