如何使用聚合对 SQL 中的结果集进行两次排序?

How can I sort a result set twice in SQL with an aggregate?

我有一个时间跟踪数据库,我试图从中获取按工人姓名和工作周分组的每周总工作时数列表。

这是我对 return 所有必要数据的查询:

SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
    AND [Hours] > 0
    AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]

我希望数据像这样排序:

|    Timesheet Period    |    Employee Name    |    Hours    |
--------------------------------------------------------------
|   12/06/20 - 12/12/20  |    Joe Smith        |      70     |
--------------------------------------------------------------
|   12/13/20 - 12/19/20  |    Joe Smith        |      46     |
--------------------------------------------------------------
|   12/20/20 - 12/26/20  |    Joe Smith        |      42     |
--------------------------------------------------------------
|   12/06/20 - 12/12/20  |    Robin Williams   |      40     |
--------------------------------------------------------------
|   12/13/20 - 12/19/20  |    Robin Williams   |      40     |
--------------------------------------------------------------
|   12/20/20 - 12/26/20  |    Robin Williams   |      40     |
--------------------------------------------------------------
|   12/13/20 - 12/19/20  |    Jane Doe         |      43     |
--------------------------------------------------------------
|   12/20/20 - 12/26/20  |    Jane Doe         |      54     |
--------------------------------------------------------------
|   12/06/20 - 12/12/20  |    Keanu Reeves     |      45     |
--------------------------------------------------------------
|   12/13/20 - 12/19/20  |    Keanu Reeves     |      42     |
--------------------------------------------------------------
|   12/06/20 - 12/12/20  |    Derek Zoolander  |      40     |
--------------------------------------------------------------
|   12/13/20 - 12/19/20  |    Derek Zoolander  |      40     |
--------------------------------------------------------------

因此,员工在给定时间范围内从最高总小时数降序排列,而且他们的工作时间也按姓名分组,并按他们在给定时间范围内工作的周数升序排列。

我不确定这是否可行,但我想我可以以某种方式对每个名称进行 SUM(Hours) 和排序,然后使用该结果对周数进行排序。欢迎任何想法:)

您可以在 ORDER BY 中使用 window 函数:

SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours
FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26' AND
      [Hours] > 0 AND
      [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
ORDER BY SUM(SUM([Hours]) OVER (PARTITION BY [Employee Name]) DESC,
         [Employee Name],
         MIN([Date Worked]);
SELECT [Timesheet Period], [Employee Name], SUM([Hours]) AS Hours FROM timetracker
WHERE [Date Worked] BETWEEN '2020-12-06' AND '2020-12-26'
    AND [Hours] > 0
    AND [Mgr Name] <> ''
GROUP BY [Employee Name], [Timesheet Period]
Order by SUM([Hours]), [Timesheet Period]