Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Incorrect sum when I join a second table

This is the first time I ask for your help,

Actually I have to create a query, and did a similar example for it. I have two tables,

Report (ReportID, Date, headCount)
Production(ProdID, ReportID, Quantity)

My question is using this query, I get a wrong result,

SELECT    
    Report.date, 
    SUM(Report.HeadCount) AS SumHeadCount, 
    SUM(Production.Quantity) AS SumQuantity
FROM         
    Report 
INNER JOIN
    Production ON Report.ReportID = Production.ReportID
GROUP BY
    Date
ORDER BY
    Date

I guess some rows are being counted more than once, could you please give me a hand?

EDIT

if i run a query to get a sum of headcount grouped by day, I get:

  date        Headcount
7/2/2012    1843
7/3/2012    1802
7/4/2012    1858
7/5/2012    1904

also for Production Qty I get:

2012-07-02  8362
2012-07-03  8042
2012-07-04  8272
2012-07-05  9227

but when i combine the both queries i get i false one, i expect on 2 july 8362 qty against 1843, but i get:

 day      TotalHeadcount    totalQty
7/2/2012    6021    8362
7/3/2012    7193    8042
7/4/2012    6988    8272
7/5/2012    7197    9227
like image 712
alphawt Avatar asked Sep 27 '12 11:09

alphawt


People also ask

What happens when two tables are joined?

(INNER) JOIN : Returns records that have matching values in both tables. LEFT (OUTER) JOIN : Returns all records from the left table, and the matched records from the right table. RIGHT (OUTER) JOIN : Returns all records from the right table, and the matched records from the left table.

How do you join two tables even if no match?

The SQL LEFT JOIN returns all rows from the left table, even if there are no matches in the right table. This means that if the ON clause matches 0 (zero) records in the right table; the join will still return a row in the result, but with NULL in each column from the right table.

How do you join two tables based on conditions?

You join two tables by creating a relationship in the WHERE clause between at least one column from one table and at least one column from another. The join creates a temporary composite table where each pair of rows (one from each table) that satisfies the join condition is linked to form a single row.


1 Answers

One way of avoiding this (subject to RDBMS support) would be

WITH R
     AS (SELECT *,
                Sum(HeadCount) OVER (PARTITION BY date) AS SumHeadCount
         FROM   Report)
SELECT R.date,
       SumHeadCount,
       Sum(P.Quantity) AS SumQuantity
FROM   R
       JOIN Production P
         ON R.ReportID = P.ReportID
GROUP  BY R.date, SumHeadCount
ORDER  BY R.date 
like image 99
Martin Smith Avatar answered Oct 13 '22 22:10

Martin Smith