[英]how to get total of amount against person_number and some more columns in a single oracle SQL query and grand amount
我有一张桌子,查询是这样的
SELECT
cost_center_name,
person_number,
person_full_name,
TO_DATE(TO_CHAR(wfc_start_date,'DD-MON-YYYY HH:MI:SS AM'),'DD-MON-YYYY HH:MI:SS AM') start_date,
TO_DATE(TO_CHAR(wfc_end_date,'DD-MON-YYYY HH:MI:SS AM'),'DD-MON-YYYY HH:MI:SS AM') end_date,
TO_CHAR(wfc_start_date,'DD-MON-YYYY HH:MI:SS AM') start_date_hours,
TO_CHAR(wfc_end_date,'DD-MON-YYYY HH:MI:SS AM') end_date_hours,
pay_code_name,
duration_dd_hh_mi_ss,
wage_amount,
FROM
XX_pay_type a
WHERE
person_number IN (
'102',
'103'
)
AND pay_period_ending_date = '20-APR-2019'
duration_dd_hh_mi_ss的值类似00:4:32:00 00:3:20:00
我想从SQL查询针对person_number的sum(wage_amount)和sum(duration_dd_hh_mi_ss)我也想要grand_total(wage_amount)
sum(duration_dd_hh_mi_ss)在这种情况下将为00:7:52:00
我尝试将sum(wage_amount)超过(按person_number划分),但是我无法获得针对person_number和grand(wage_total)的总和(duration_dd_hh_mi_ss)
' duration_dd_hh_mi_ss
'列的数据类型是什么?
如果duration
是end_date
和start_date
减法,则使用减法。 不要遵循第一步。
1个
否则,使用to_dsinterval() 。 但是为了能够使用它,我们需要先更换:
在duration
与空间,因为to_dsinterval
不接受此参数。
select regexp_replace('00:2:32:00', ':', ' ', 1, 1) from dual; --> 00 2:32:00
select to_dsinterval(regexp_replace('00:2:32:00', ':', ' ', 1, 1)) from dual;
现在,我们有了一些可以总结的间隔,但需要付出一些努力。 这不是小事,但可能 。 字符串不能。
2
要在一个查询中获得部分总和和总计,请使用具有cube
, rollup
或grouping sets
聚合。 这是rollup
示例:
-- sample data
with t(center, id, name, duration, wage_amount) as (
select 'C1', '102', 'Tim', '01:2:00:00', 80 from dual union all
select 'C1', '102', 'Tim', '00:0:32:00', 70 from dual union all
select 'C2', '102', 'Tim', '00:2:00:00', 100 from dual union all
select 'C2', '103', 'Bob', '00:2:00:00', 120 from dual )
-- end of sample data
查询:
select center, id, name, sum(wage_amount) amt,
numtodsinterval(sum(sysdate + to_dsinterval(regexp_replace(duration, ':', ' ', 1, 1))
- sysdate ), 'day') duration
from t
group by rollup((id, name), center)
结果:
CENTER ID NAME AMT DURATION
------ --- ---- ---------- -------------------
C1 102 Tim 150 +000000001 02:32:00
C2 102 Tim 100 +000000000 02:00:00
102 Tim 250 +000000001 04:32:00
C2 103 Bob 120 +000000000 02:00:00
103 Bob 120 +000000000 02:00:00
370 +000000001 06:32:00
您也可以在开始时使用分析和来完成此操作,这将在其他列中提供值。 或者对您的数据和分组查询进行并集( union all
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.