按每周总计分组,仅显示最大总和记录(访问)

时间:2014-09-26 17:19:53

标签: sql sql-server group-by sum

好的,所以 - 在SQL Server中 - 我需要总结每周的记录数,并且只显示总和最高的一周(以及那周的记录数)..

到目前为止,我可以显示每条记录,但我只对最高记录感兴趣。任何帮助将不胜感激。

*编辑,因为有一些混乱: 我需要一个出现的总和,按周分组(所以在这种情况下:项目Q单位300 201435 2 是最高的,因为同一项目和单位组合的第38周的总和是1.) 输出应该如下所示。我现在得到的是所有周数及其各自的总和,我只需要用最大总和显示一周

*希望有道理:)

我的表格如下:

Project Name    Subunit name    Date of release     Origin      Week
Project X       SubUnit 1       28-Jul-14           Unit 100    201431
Project X       SubUnit 2       28-Jul-14           Unit 100    201431
Project X       SubUnit 3       28-Jul-14           Unit 100    201431
Project X       SubUnit 4       18-Sep-14           Unit 100    201438
Project X       SubUnit 5       18-Sep-14           Unit 100    201438
Project X       SubUnit 6       18-Sep-14           Unit 300    201438
Project X       SubUnit 7       05-Aug-14           Unit 300    201432
Project X       SubUnit 8       05-Aug-14           Unit 300    201432
Project X       SubUnit 9       18-Sep-14           Unit 600    201438
Project X       SubUnit 10      18-Sep-14           Unit 600    201438
Project X       SubUnit 11      18-Sep-14           Unit 600    201438
Project X       SubUnit 12      18-Sep-14           Unit 600    201438
Project Q       SubUnit 1       18-Sep-14           Unit 100    201438
Project Q       SubUnit 2       18-Sep-14           Unit 100    201438
Project Q       SubUnit 3       18-Sep-14           Unit 100    201438
Project Q       SubUnit 4       18-Sep-14           Unit 100    201438
Project Q       SubUnit 5       18-Sep-14           Unit 100    201438
Project Q       SubUnit 6       18-Sep-14           Unit 300    201438
Project Q       SubUnit 7       29-Aug-14           Unit 300    201435
Project Q       SubUnit 8       29-Aug-14           Unit 300    201435
Project Q       SubUnit 9       29-Aug-14           Unit 600    201435
Project Q       SubUnit 10      18-Sep-14           Unit 600    201438
Project Q       SubUnit 11      18-Sep-14           Unit 600    201438
Project Q       SubUnit 12      18-Sep-14           Unit 600    201438

所需的输出是:

Project Q   Unit 100    201438  5
Project Q   Unit 300    201435  2
Project Q   Unit 600    201438  3
Project X   Unit 100    201431  3
Project X   Unit 300    201432  2
Project X   Unit 600    201438  4

1 个答案:

答案 0 :(得分:1)

我不知道RDBMS所以我假设SQL SERVER,因此CTE(公用表表达式)可以工作。

我们可以通过使用子查询来避免使用cte(如果需要的话)...我也删除了列名中的空格,因为我没有'知道我是否应该使用`或[或"逃避字段名称....

http://sqlfiddle.com/#!3/82c01/14/0

With CTE AS (SELECT ProjectName, Origin, Week, count(projectname) as myCount
    FROM FOO
    GROUP BY ProjectName, Origin, week)
SELECT A.ProjectName, A.Origin, A.Week, A.MyCount
FROM CTE A
INNER JOIN (SELECT ProjectName, Origin, Max(myCount) MaxMyCount 
            FROM CTE
            GROUP BY ProjectName, Origin) B
   on A.Projectname = B.ProjectName
  and A.Origin = B.Origin
  and A.myCount = B.MaxMyCount
ORDER BY ProjectName, Origin, Week

现在关于这是做什么的:

  • 我们生成一组数据(CTE),其中包含每个项目,来源和周的计数。
  • 接下来,我们将该组数据用作源,然后将其连接到CTE的子集,该子集仅包含每个项目名称和原点的最大计数。
  • 因为加入并不关心一周,但是关心计数;我们能够加入计数,这个内部联接允许我们通过计数,项目名称和来源识别,返回几周。
  • 但是,这确实假定每个项目名称和来源的唯一计数。如果不唯一,我们将在结果中获得重复,因为MAX返回的记录超过1条。

本质上我生成了3组数据。

  • 1包含项目,来源和周的汇总计数。
  • 1仅包含项目和原点以及项目/原点的最大数量
  • 然后是结果集,它是前两个的组合。

RDBMS是基于SET的逻辑,你在集合和子集方面对事物的想法越多,(在我看来)构建这样的查询就越容易。