sql - Duplicates when self joining tables -
i'm getting duplicates when self join on fact table. i'm looking join on fact table twice produce aggregate totals. sql results returning duplicate projects when join on fact table percentage , production aggregates. there may better way this. i'm suggestions. (db2)
select distinct dp.project_id, dp.project_name, dm.building_name, da.amount, cast(sum(cast(fat.transaction_amount real)) integer) gross, (da.amount - sum(fat.transaction_amount)) net, percent.percentage_used, prod.production fact_table fat right join alcf_warehouse.dim_a da on fat.dim_a_id = da.dim_a_id inner join alcf_warehouse.dim_project dp on fat.dim_project_id = dp.dim_project_id inner join alcf_warehouse.dim_date dd on fat.start_date_dim_id = dd.date_key inner join alcf_warehouse.dim_date t3 on fat.end_date_dim_id = t3.date_key inner join alcf_warehouse.dim_job dj on fat.dim_job_id = dj.dim_job_id inner join alcf_warehouse.dim_building dm on fat.building_id = dm.building_id inner join alcf_warehouse.dim_date t5 on dj.job_end_id = t5.date_key inner join alcf_warehouse.dim_date t10 on dj.job_start_id = t10.date_key inner join alcf_warehouse.dim_date dds on dds.date_key = da.a_start_date_id inner join alcf_warehouse.dim_date dde on dde.date_key = da.a_end_date_id join ( select dp.dim_project_id, concat(((sum(fat.transaction_amount)/da.amount)*100),'%') percentage_used fact_table fat inner join dim_a da on fat.dim_a_id = da.dim_a_id inner join dim_project dp on fat.dim_project_id = dp.dim_project_id da.building_name in ('main', 'secondary') , da.type_name = 'invision' group dp.dim_project_id, da.amount having concat(((sum(fat.transaction_amount)/da.amount)*100),'%') <> '.00%' ) percent on dp.dim_project_id = percent.dim_project_id join ( select dj.dim_project_id, cast(sum(cast(fat.transaction_amount real)) integer) production fact_table fat right outer join dim_a da on fat.dim_a_id = da.dim_a_id inner join dim_job dj on fat.dim_job_id = dj.dim_job_id dj.size in ('33% <= x <= 100%', '16% <= x < 33%') , da.building_name in ('main', 'secondary') , da.type_name = 'invision' group dj.dim_project_id ) prod on dp.dim_project_id = prod.dim_project_id ((dd.date_value >= '2013-01-01' , t3.date_value <= '2014-01-01') or (((dd.date_value > '2013-01-01' , dd.date_value < '2014-01-01') or (t3.date_value <= '2014-01-01' , t3.date_value > '2013-01-01') or (dd.date_value <= '2013-01-01' , t3.date_value > '2014-01-01')) , (t5.date_value >= '2013-01-01' , t5.date_value < '2014-01-01'))) , dm.building_name in ('main', 'secondary') , da.type_name = 'invision' , dds.year4 = '2013' group dp.dim_project_id, dp.project_name, dm.machine_name, da.amount, percent.percentage_used, prod.production order project_name results of query above: 
desired results: 
i discovered having clause not needed able remove table join percentage aggregation , calculate percentage outside self join. removed duplicates.
select distinct dp.project_id, dp.project_name, dm.building_name, da.amount, cast(sum(cast(fat.transaction_amount real)) integer) gross, (da.amount - sum(fat.transaction_amount)) net, concat(((sum(fat.transaction_amount)/da.amount)*100),'%') percentage_used, prod.production fact_table fat right join alcf_warehouse.dim_a da on fat.dim_a_id = da.dim_a_id inner join alcf_warehouse.dim_project dp on fat.dim_project_id = dp.dim_project_id inner join alcf_warehouse.dim_date dd on fat.start_date_dim_id = dd.date_key inner join alcf_warehouse.dim_date t3 on fat.end_date_dim_id = t3.date_key inner join alcf_warehouse.dim_job dj on fat.dim_job_id = dj.dim_job_id inner join alcf_warehouse.dim_building dm on fat.building_id = dm.building_id inner join alcf_warehouse.dim_date t5 on dj.job_end_id = t5.date_key inner join alcf_warehouse.dim_date t10 on dj.job_start_id = t10.date_key inner join alcf_warehouse.dim_date dds on dds.date_key = da.a_start_date_id inner join alcf_warehouse.dim_date dde on dde.date_key = da.a_end_date_id join ( select dj.dim_project_id, cast(sum(cast(fat.transaction_amount real)) integer) production fact_table fat right outer join dim_a da on fat.dim_a_id = da.dim_a_id inner join dim_job dj on fat.dim_job_id = dj.dim_job_id dj.size in ('33% <= x <= 100%', '16% <= x < 33%') , da.building_name in ('main', 'secondary') , da.type_name = 'invision' group dj.dim_project_id ) prod on dp.dim_project_id = prod.dim_project_id ((dd.date_value >= '2013-01-01' , t3.date_value <= '2014-01-01') or (((dd.date_value > '2013-01-01' , dd.date_value < '2014-01-01') or (t3.date_value <= '2014-01-01' , t3.date_value > '2013-01-01') or (dd.date_value <= '2013-01-01' , t3.date_value > '2014-01-01')) , (t5.date_value >= '2013-01-01' , t5.date_value < '2014-01-01'))) , dm.building_name in ('main', 'secondary') , da.type_name = 'invision' , dds.year4 = '2013' group dp.dim_project_id, dp.project_name, dm.machine_name, da.amount, prod.production order project_name
Comments
Post a Comment