【问题标题】:How can I sort a result set twice in SQL with an aggregate?如何在 SQL 中使用聚合对结果集进行两次排序?
【发布时间】:2021-04-02 18:11:14
【问题描述】:

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

这是我返回所有必要数据的查询:

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) 并排序,然后使用该结果来按顺序排列周数。欢迎任何想法:)

【问题讨论】:

    标签: sql sql-server database sql-order-by


    【解决方案1】:

    ORDER BY中可以使用窗口函数:

    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]);
    

    【讨论】:

    • 按该范围内的总工作时间排序后,然后是名称,我想他想按时间段而不是小时数排序。
    • @kaladin_storm 。 . .我认为你是对的。谢谢。
    【解决方案2】:
    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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-24
      • 1970-01-01
      • 2019-04-02
      • 2020-10-12
      • 1970-01-01
      • 2019-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多