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: enter image description here

desired results: enter image description here

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

Popular posts from this blog

How to remove text and logo OR add Overflow on Android ActionBar using AppCompat on API 8? -

html - How to style widget with post count different than without post count -

url rewriting - How to redirect a http POST with urlrewritefilter -