2012-09-27 12 views
6

Jest to pierwszy raz, kiedy prosić o pomoc,Nieprawidłowa suma kiedy dołączyć do drugiej tabeli

Właściwie muszę utworzyć kwerendę i zrobił podobny przykład dla niego. Mam dwie tabele,

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

Moje pytanie jest przy użyciu tej kwerendy, mam zły wynik,

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 

Chyba niektóre wiersze są policzone więcej niż raz, czy mógłbyś mi pomóc ?

EDIT

Jeśli uruchomić kwerendę, aby uzyskać sumę zatrudnienia pogrupowane według dzień, otrzymuję:

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

także dla Produkcji Ilość uzyskać:

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

ale gdy łączę oba zapytania, otrzymuję fałszywy jeden, oczekuję 2 lipca 8362 qty przeciwko 1843, ale dostaję:

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

co jest źle z wynikiem, który otrzymujesz? Czy możesz zamieścić kilka przykładowych danych i oczekiwany wynik? – Taryn

+1

@bluefeet - To będzie sumowanie Report.HeadCount wiele razy dla każdego wiersza wprowadzonego przez join. –

+1

@MartinSmith Zgadzam się z Tobą, ale chcę, żeby OP wyjaśnił, jaki jest problem z wynikiem. Im więcej szczegółów, tym lepiej. :) – Taryn

Odpowiedz

1

Grupa rekordów na bieżąco przy użyciu następujących

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

Kolumna "ReportSummary.SumHeadCount" jest niepoprawna na liście select, ponieważ nie jest zawarta ani w funkcji agregującej, ani w klauzuli GROUP BY. – alphawt

+0

Edytowano. Pls sprawdź teraz – Prasanna

2

To może być pomocne

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

Tak. dzięki za odpowiedź. Edytował odpowiedź – Prasanna

+0

im przy użyciu SQL SERVER 2008 – alphawt

3

Jednym ze sposobów uniknięcia tego (objęte wsparciem RDBMS) byłoby

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

zastosowałem twój pomysł i mam go! bardzo dziękuję^^ – alphawt

Powiązane problemy