不按日期分组?

时间:2010-06-22 14:40:43

标签: .net sql-server datetime group-by

我有一个存储文档信息的数据库表(DocID,Name,Type,Owner等)。然后我有另一个表存储文件下载的时间(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)

3 个答案:

答案 0 :(得分:2)

问题出在您的GROUP BY子句中。

如果您说GROUP BY DocType,Month,Year表示任何时候任何与其他不同,将它们单独计算

如果您想要全年的总数,那么您需要做的是仅限GROUP BY年,如果您想要每年每个月的计数,则需要按月分组。

答案 1 :(得分:0)

当您需要年度汇总时,您必须使用不按月分组的其他查询 - 或者您必须对结果进行后处理以累计来自一年中不同月份的计数。

正如所写的那样,你的代码总是按月和年分组,在月份发生变化时会生成新行 - 如果不破坏SQL中的每条规则(好吧,我夸大了 - 很多规则),它就无法做到。

答案 2 :(得分: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)
相关问题