2012-09-27 14 views
6

Questa è la prima volta che chiedo il vostro aiuto,somma non corretta quando mi unisco a una seconda tabella

In realtà devo creare una query, e ha fatto un esempio simile per esso. Ho due tabelle,

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

La mia domanda sta usando questa query, ottengo un risultato sbagliato,

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 

Credo che alcune righe sono stati contati più di una volta, la prego di darmi una mano ?

EDIT

se esegue una query per ottenere una somma di organico raggruppati per giorno, ottengo:

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

anche per Quantità di produzione ottengo:

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

ma quando combino entrambe le query ne ottengo uno falso, mi aspetto il 2 luglio 8362 qty contro il 1843, ma ottengo:

day  TotalHeadcount totalQty 
7/2/2012 6021 8362 
7/3/2012 7193 8042 
7/4/2012 6988 8272 
7/5/2012 7197 9227 
+6

cosa è sbagliato con il risultato che ottieni? Puoi pubblicare alcuni dati di esempio e il risultato atteso? – Taryn

+1

@bluefeet: somma di Report.HeadCount più volte per ogni riga introdotta dal join. –

+1

@MartinSmith Sono d'accordo con te, ma voglio che l'OP chiarisca qual è il problema con il risultato. Più dettagli, meglio è. :) – Taryn

risposta

1

record del Gruppo per data utilizzando seguente

SELECT ReportSummary.ReportDate, SUM(ReportSummary.SumHeadCount) AS SumHeadCount, SUM(ProductionSummary.SumQuantity) AS SumQuantity 
FROM 
(
    SELECT Report.ReportDate, SUM(Report.HeadCount) AS SumHeadCount 
    FROM Report 
    GROUP BY Report.ReportDate 
) AS ReportSummary 
INNER JOIN 
(
    SELECT Report.ReportDate, Sum(Production.Quantity) AS SumQuantity 
    FROM Production 
    INNER JOIN Report 
    ON Report.ReportID = Production.ReportID 
    GROUP BY Report.ReportDate 
) AS ProductionSummary 
ON ReportSummary.ReportDate = ProductionSummary.ReportDate 
GROUP BY ReportSummary.ReportDate 
ORDER BY ReportSummary.ReportDate 
+0

La colonna 'ReportSummary.SumHeadCount' non è valida nell'elenco di selezione perché non è contenuta in una funzione di aggregazione o nella clausola GROUP BY. – alphawt

+0

Modificato. Controllo di Pls ora – Prasanna

2

Questo può essere utile

SELECT Report.ReportDate, 
     Sum(Report.HeadCount) AS SumHeadCount, 
     ProductionSummary.SumQuantity 
FROM Report 
     INNER JOIN (SELECT ReportID, 
          Sum(Production.Quantity) AS SumQuantity 
        FROM Production 
        GROUP BY ReportID) AS ProductionSummary 
     ON Report.ReportID = ProductionSummary.ReportID 
GROUP BY ReportDate 
ORDER BY ReportDate 
+0

Sì. grazie per la risposta. Modificata la risposta – Prasanna

+0

con SQL SERVER 2008 – alphawt

3

Un modo per evitare questo (soggetto a supporto RDBMS) sarebbe

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 
+0

ho applicato la tua idea e l'ho presa! grazie mille ^^ – alphawt

Problemi correlati