如何在单个Oracle SQL查询和巨额数量中获得对Person_Number的总金额和更多列



我有一个表,查询就像这样

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'

lisation_dd_hh_mi_ss, 具有00:4:32:00之类的值 00:3:20:00

我想要sql查询的总和(wage_amount(和sum(duration_dd_hh_mi_ss(反对person_number我也想要grand_total(wage_amount(

sum(duration_dd_hh_mi_ss(将在这种情况下00:7:52:00

我尝试了sum(wage_amount((person_number的分区(但是我无法获得对person_number和grand(wage_total(

的总和(lis_dd_hh_mi_ss(

如果durationend_datestart_date的缩写,则使用sudstraction。不要遵循第一步。

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(。

' duration_dd_hh_mi_ss'列的数据类型是什么?

相关内容

最新更新