Re: A 3 table join question - Mailing list pgsql-general

From rob stone
Subject Re: A 3 table join question
Date
Msg-id 2c4327dfb71736d32cefb19fde7820fc3a36569e.camel@gmail.com
Whole thread Raw
In response to A 3 table join question  (stan <stanb@panix.com>)
Responses Re: A 3 table join question
Re: A 3 table join question
List pgsql-general
Hello,

On Fri, 2019-08-16 at 07:39 -0400, stan wrote:
> First let me say a huge THANK YOU to all the helpful people that
> hanging out
> on this.
> 
> I am changing from one type of work, going back to some database work
> for a
> project, as my old job was eliminated. I have made great progress on
> this,
> thanks to the time and effort of lots of folks from this list.
> 
> Now, here is my latest stumbling block. I have three "data streams"
> that all
> contribute to the total costs of a project:
> 
> * labor cost
> * material cost
> * expense report cost
> 
> I have a view that summarizes the burdened cost from each of these 3
> streams, and i am trying to create a view that shows the total
> project cost.
> 
> Here is the test data from each of the 3 streams:
> 
> stan=> select * from labor_cost_sum_view ;
>  proj_no | labor_bill_sum | labor_cost_sum 
>  ---------+----------------+----------------
>    45 |     10810.0000 |  3133.17500000
>   764 |      8712.0000 |   810.75000000
>   789 |     46335.5400 |  7015.57500000
>  (3 rows)
> 
> stan=> select * from material_cost_sum_view ;
>  proj_no | mtrl_cost 
>  ---------+-----------
>    45 | 5394.6800
>   764 | 7249.4800
>  7456 | 4007.3000
> (3 rows)
> 
> stan=> select * from expense_report_cost_sum_view ;
>  proj_no | incured_sum | burdened_cost 
>  ---------+-------------+---------------
>    45 |     2564.98 |   2564.980000
>  7456 |     1747.11 |   1747.110000
> (2 rows)
> 
> And here is the clause for creating the summary table that I
> presently have:
> 
> 
> DROP VIEW overall_cost_sum_view ;
> 
> CREATE view overall_cost_sum_view as 
> select 
>     material_cost_sum_view.proj_no as l_proj_vo ,
>     labor_cost_sum_view.proj_no as m_proj_vo , 
>     expense_report_cost_sum_view.proj_no as x_proj_vo , 
>     cast (labor_cost_sum_view.labor_cost_sum as money) as
> l_burdened_cost,
>     cast (material_cost_sum_view.mtrl_cost as money)as
> m_burdened_cost,
>     cast (expense_report_cost_sum_view.burdened_cost as money)as
> x_burdened_cost ,
>     cast (
>             coalesce( labor_cost_sum_view.labor_cost_sum,
> 0) 
>             +
>                    coalesce(material_cost_sum_view.mtrl_cost, 0)
>             +
>                    coalesce(expense_report_cost_sum_view.burdene
> d_cost, 0)
>            as money)  as ttl_cost
> from 
>     labor_cost_sum_view 
> full join    material_cost_sum_view  on
>     material_cost_sum_view.proj_no = labor_cost_sum_view.proj_no
> full join    expense_report_cost_sum_view  on
>     expense_report_cost_sum_view.proj_no =
> labor_cost_sum_view.proj_no
> ;
> 
> Which results in the following:
> 
> stan=> select * from overall_cost_sum_view ;
> -----------+-----------+-----------+-----------------+---------------
> --+-------- ---------+------------
>         45 |        45 |        45 |       $3,133.18
> |       $5,394.68 |       $ 2,564.98 | $11,092.84
>        764 |       764 |           |         $810.75
> |       $7,249.48 |                  |  $8,060.23
>            |       789 |           |       $7,015.58
> |                 |                  |  $7,015.58
>       7456
> |           |           |                 |       $4,007.30
> |                  |  $4,007.30
>            |           |      7456
> |                 |                 |       $ 1,747.11 |  $1,747.11
> (5 rows)
> 
> 
> As you can see this statement seems to work correctly on the join of
> the
> labor and material costs, but fails when I add the expense report
> stream.
> 
> What am I doing wrong here?
> 


Your view assumes that all three "streams" contain all the proj_no's
whereas your test data for expense_report_cost_sum_view has no proj_no
= 764.

How do you know which of the three "streams" contains all proj_no's?

Maybe you should consider the crosstab code so you end up with
something like this;-

proj_no | Labour | Material | Expenses

  45    | 10810  |   5394   |   2564
 764    |  8712  |   7249   |      0
 789    | 46335  |   4007   |   1747
 






pgsql-general by date:

Previous
From: "David G. Johnston"
Date:
Subject: Re: A 3 table join question
Next
From: Tom Lane
Date:
Subject: Re: Bad Estimate for complex query with JOINS on subselects and OR in where conditions