【发布时间】:2019-12-08 17:13:21
【问题描述】:
我有一个包含用户每月出勤详细信息的表格,其中有一个加班列。因此该表具有以下结构和示例数据:
Date - Id - Dept - OT - Status
12/1/2019 - 1001 - HR - 2 - P
12/2/2019 - 1001 - HR - 4 - P
12/1/2019 - 1002 - IT - 2 - P
12/2/2019 - 1002 - IT - 4 - P
我在这里省略了进出时间,因为这不是这里的主要问题。如上所示,加班时间是为每个用户计算的。因此很容易计算出一个用户或部门的总加班详情如下:
SELECT DEPT, SUM(OT) TOTAL FROM ATTENDANCE m WHERE M.DATE >= '01-DEC-2019' AND M.DATE <= '10-DEC-2019'
GROUP BY M.DEPT
我的要求是获取具有特定日期范围的部门的每周或 7 天加班详细信息,加班范围为 40。例如:对于一个部门,日期范围为 2019 年 12 月 1 日至 7 日总加班时间最长为 40 小时或 41 至 50 小时。所以我尝试了以下方法:
SELECT DEPT, SUM(OT) TOTAL FROM ATTENDANCE m WHERE M.DATE >= '01-DEC-2019' AND M.DATE <= '07-DEC-2019'
HAVING SUM(OT) <= 40 GROUP BY M.DEPT
或者:
SELECT DEPT, SUM(OT) TOTAL FROM ATTENDANCE m WHERE M.DATE >= '01-DEC-2019' AND M.DATE <= '07-DEC-2019'
HAVING SUM(OT) BETWEEN 41 AND 50 GROUP BY M.DEPT
或者:
SELECT DEPT, SUM(OT) TOTAL FROM ATTENDANCE m WHERE M.DATE >= '01-DEC-2019' AND M.DATE <= '07-DEC-2019'
HAVING SUM(OT) > 50 GROUP BY M.DEPT
但最后一个查询似乎返回了奇怪的输出,并且似乎返回了我在第一个查询中检索到的数据。这些是我厌倦的单独查询,但我正在考虑是否可以使用子查询将其与CASE WHEN 一起使用,上面给出的所有范围如下:
CASE WHEN M.DATE >= '01-DEC-2019' AND M.DATE <= '07-DEC-2019'
AND SUM(OT) <= 40 THEN SUM(OT)
CASE WHEN M.DATE >= '01-DEC-2019' AND M.DATE <= '07-DEC-2019'
AND SUM(OT) BETWEEN 41 AND 50 THEN SUM(OT)
我不确定聚合函数是否可以与 CASE WHEN 语句一起使用,或者我可以使用上述任何方式在查询中运行多个范围?谢谢。
【问题讨论】:
-
不再阅读,先试试这个...不要将日期与字符串进行比较。而不是
'01-DEC-2019',而是写to_date('01-DEC-2019', 'DD-MON-YYYY')(和其他地方类似),看看查询是否按需要工作。