繁体   English   中英

如何在单个oracle SQL查询中获得针对person_number和更多列的总金额和总金额

[英]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 '列的数据类型是什么?

如果durationend_datestart_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

要在一个查询中获得部分总和和总计,请使用具有cuberollupgrouping 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM