Oracle Sql中聚合函数的大小写
我有一个包含用户每月出勤详细信息的表,其中有一个加班列。因此,该表具有以下结构和样本数据:Oracle Sql中聚合函数的大小写,sql,oracle,oracle10g,Sql,Oracle,Oracle10g,我有一个包含用户每月出勤详细信息的表,其中有一个加班列。因此,该表具有以下结构和样本数据: 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 我省略了这里的进出时间,因为这不是这里的主要问题。如上所述,加
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
当语句时,我不确定聚合函数是否可以与
CASE一起使用,或者我是否可以使用上述方法在查询中运行多个范围?谢谢。您可以使用大小写来区分所有值。例如:
select
dept,
sum(ot) as total,
case when sum(ot) <= 40 then 'g1'
when sum(ot) > 40 and sum(ot) <= 50 then 'g2'
else 'g3' end as g
from attendance
where between to_date('2019-12-01', 'yyyy-mm-dd')
and to_date('2019-12-07', 'yyyy-mm-dd')
group by dept
选择
部,
总金额(ot),
当求和(ot)40和求和(ot)时,您可以使用case
区分所有值。例如:
select
dept,
sum(ot) as total,
case when sum(ot) <= 40 then 'g1'
when sum(ot) > 40 and sum(ot) <= 50 then 'g2'
else 'g3' end as g
from attendance
where between to_date('2019-12-01', 'yyyy-mm-dd')
and to_date('2019-12-07', 'yyyy-mm-dd')
group by dept
选择
部,
总金额(ot),
当sum(ot)40和sum(ot)时,您能更明确地说明您想要的输出是什么吗?您似乎在寻找两个结果(加班时间最多为40小时的部门和在给定日期范围内加班时间超过40小时的部门)
查看您的上一个查询:
当M.DATE>=“2019年12月1日”和M.DATE时,您能更明确地说明您想要的输出是什么吗?您似乎在寻找两个结果(加班时间最多为40小时的部门和在给定日期范围内加班时间超过40小时的部门)
查看您的上一个查询:
如果M.DATE>='01-DEC-2019'和M.DATE没有进一步阅读,请先尝试此。。。不要将日期与字符串进行比较。将'01-DEC-2019'
写入日期('01-DEC-2019'、'DD-MON-YYYY')
(以及其他地方的类似内容),查看查询是否按需工作。无需进一步阅读,请先尝试此操作。。。不要将日期与字符串进行比较。将'01-DEC-2019'
写入日期('01-DEC-2019','DD-MON-YYYY')
(以及其他地方的类似内容),查看查询是否按需工作。在此处,当我不知道我完全理解你的要求时,我可以写这个-吗?你希望一个聚合函数是一个CASE
语句的结果吗?根据您对整个查询的期望输出,可能有一种更简单的方法来获得您期望的结果在这里,我可以写这个-当我不知道我完全理解您的要求时-您是否希望聚合函数是CASE
语句的结果?根据整个查询的期望输出,可能有一种更简单的方法来获得期望的结果result@mathguy好的,这不是重点的一部分,但修复了在Oracle中工作的代码。另外还使用了ISO日期格式,删除了英语格式。“不是重点的一部分”是正确的,但仍然-如果我们教某人如何做代数,我们不允许他们除以零,即使这不是他们要求的。不管怎么说,你解决了,所以我取消了否决票。这就是它的工作原理。我本来不会反对的,但这两个答案(都使用字符串表示日期)都是在我已经在OP的问题下的评论中指出后发布的。@mathguy OK,不是问题的一部分,但修复了在Oracle中工作的代码。另外还使用了ISO日期格式,删除了英语格式。“不是重点的一部分”是正确的,但仍然-如果我们教某人如何做代数,我们不允许他们除以零,即使这不是他们要求的。不管怎么说,你解决了,所以我取消了否决票。这就是它的工作原理。我不会反对,但这两个答案(都使用字符串表示日期)都是在我已经在OP的问题下的评论中指出这一点后发布的。
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 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)
select
dept,
sum(ot) as total,
case when sum(ot) <= 40 then 'g1'
when sum(ot) > 40 and sum(ot) <= 50 then 'g2'
else 'g3' end as g
from attendance
where between to_date('2019-12-01', 'yyyy-mm-dd')
and to_date('2019-12-07', 'yyyy-mm-dd')
group by dept