具有数据透视和行总计的oracle查询
这是我的全部需求以及创建和插入命令具有数据透视和行总计的oracle查询,oracle,pivot,Oracle,Pivot,这是我的全部需求以及创建和插入命令 create table sample ( schedule_id varchar2(256), schedule_details varchar2(256), pod_name varchar2(256), milestone varchar2(256), metric_column varchar2(256), metric_value varchar2(4000)); insert int
create table sample
( schedule_id varchar2(256),
schedule_details varchar2(256),
pod_name varchar2(256),
milestone varchar2(256),
metric_column varchar2(256),
metric_value varchar2(4000));
insert into sample values ('23456','details','ABCD','M1','status','DONE');
insert into sample values ('123456','details','ABCD','M1','progress','GREEN');
insert into sample values ('123456','details','ABCD','M1','last_reported','2016-03-18 04:18:56');
insert into sample values ('123456','det','ABCD','M2','status','DONE');
insert into sample values ('123456','det','ABCD','M2','progress','RED');
insert into sample values ('123456','det','ABCD','M2','last_reported','2016-03-19 04:18:56');
insert into sample values ('123456','det','ABCD','M3','status','SKIP');
insert into sample values ('123456','det','ABCD','M3','progress','YELLOW');
insert into sample values ('123456','det','ABCD','M3','last_reported','2016-03-20 04:18:56');
insert into sample values ('123456','det''EFGH','M1','status','DONE');
insert into sample values ('123456','det','EFGH','M1','progress','GREEN');
insert into sample values ('123456','det','EFGH','M1','last_reported','2016-03-10 04:18:56');
insert into sample values ('123456','det','EFGH','M2','status','DONE');
insert into sample values ('123456','det','EFGH','M2','progress','RED');
insert into sample values ('123456','det','EFGH','M2','last_reported','2016-03-12 04:18:56');
insert into sample values ('123456','det','EFGH','M3','status','SKIP');
insert into sample values ('123456','det','EFGH','M3','progress','YELLOW');
insert into sample values ('123456','det','EFGH','M3','last_reported','2016-03-11 04:18:56');
insert into sample values ('7890','det','ABCD','M1','status','DONE');
insert into sample values ('7890','det','ABCD','M1','progress','GREEN');
insert into sample values ('7890','det','ABCD','M1','last_reported','2016-04-18 04:18:56');
insert into sample values ('7890','det','ABCD','M2','status','DONE');
insert into sample values ('7890','det','ABCD','M2','progress','RED');
insert into sample values ('7890','det','ABCD','M2','last_reported','2016-04-19 04:18:56');
insert into sample values ('7890','det','ABCD','M3','status','FAILED');
insert into sample values ('7890','det','ABCD','M3','progress','GREEN');
insert into sample values ('7890','det','ABCD','M3','last_reported','2016-04-20 04:18:56');
insert into sample values ('7890','det','PQRS','M1','status','DONE');
insert into sample values ('7890','det','PQRS','M1','progress','GREEN');
insert into sample values ('7890','det','PQRS','M1','last_reported','2016-04-10 04:18:56');
insert into sample values ('7890','det','PQRS','M2','status','DONE');
insert into sample values ('7890','det','PQRS','M2','progress','RED');
insert into sample values ('7890','det','PQRS','M2','last_reported','2016-04-11 04:18:56');
insert into sample values ('7890','det','PQRS','M3','status','SKIP');
insert into sample values ('7890','det','PQRS','M3','progress','GREEN');
insert into sample values ('7890','det','PQRS','M3','last_reported','2016-04-12 04:18:56');
我的输出是
SCHEDULE_ID | STATUS_DONE | STATUS_SKIP | STATUS_FAILED | STATUS_TOTAL | PROGRESS_RED | PROGRESS_GREEN | PROGRESS_YELLOW | PROGRESS_TOTAL
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------
123456 | 1 | 1 | 0 | 2 | 1 | 0 | 1 | 2
7890 | 0 | 2 | 0 | 2 | 0 | 1 | 1 | 2
查询需要为每个计划id获取不同数量的pod_名称。对于每个pod,它需要获取具有最新度量列->上次报告的里程碑的度量列->状态和度量列->进度。因此STATUS_DONE的值是具有最新里程碑(基于上次报告的_)作为STATUS DONE的POD_名称的数量
例如,对于计划id 123456,pod ABCD,里程碑M3的状态和进度需要视为M3与M1和M2相比具有最新的上次报告
我的查询具有不同的pod名称,但没有考虑最新的里程碑
select *
from (SELECT SCHEDULE_ID,SCHEDULE_DETAILS,POD_NAME,
CASE WHEN GROUPING(value) = 0
THEN value
ELSE CASE WHEN METRIC_COLUMN='status'
THEN 'STATUS_TOTAL'
ELSE 'PROGRESS_TOTAL'
END
END value
FROM sample
WHERE metric_column IN ('status','progress' )
GROUP BY SCHEDULE_ID,SCHEDULE_DETAILS,POD_NAME, METRIC_COLUMN, ROLLUP(value))
PIVOT (COUNT( DISTINCT POD_NAME) FOR VALUE in ('DONE' AS "DONE",'SKIP' AS "SKIP",'FAILED' AS "FAILED",'STATUS_TOTAL' AS "STATUS_TOTAL",'GREEN' AS GREEN,'RED' AS "RED",'YELLOW' AS "YELLOW", 'PROGRESS_TOTAL' AS "PROGRESS_TOTAL"));