2012-09-27 31 views
6

Ésta es la primera vez que pido su ayuda,suma incorrecta cuando me uno a una segunda tabla

En realidad tengo que crear una consulta, y ha hecho un ejemplo similar para ello. Tengo dos tablas,

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

Mi pregunta está usando esta consulta, aparece un resultado erróneo,

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 

supongo que algunas filas están siendo contados más de una vez, ¿podría por favor, dame una mano ?

EDITAR

si corro una consulta para obtener una suma de plantilla agrupados por días, me sale:

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

también para la producción Cantidad consigo:

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

pero cuando combino las dos consultas recibo una falsa, espero el 2 de julio 8362 cantidad contra 1843, pero obtengo:

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

lo está mal con el resultado que obtienes? ¿Puedes publicar algunos datos de muestra y el resultado esperado? – Taryn

+1

@bluefeet: se sumarán Report.HeadCount varias veces por cada fila ingresada por la unión. –

+1

@MartinSmith Estoy de acuerdo contigo, pero quiero que el OP aclare cuál es el problema con el resultado. Cuantos más detalles, mejor. :) – Taryn

Respuesta

1

Grupo registra por fecha utilizando siguiente

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 columna 'ReportSummary.SumHeadCount' no es válida en la lista de selección porque no está contenida ni en una función de agregado ni en la cláusula GROUP BY. – alphawt

+0

Editado. Por favor revisa ahora – Prasanna

2

Esto puede ser útil

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í. gracias por responder. Edité la respuesta – Prasanna

+0

im usando SQL SERVER 2008 – alphawt

3

Una forma de evitar esto (habida cuenta del apoyo RDBMS) sería

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

¡apliqué tu idea y la conseguí! muchas gracias ^^ – alphawt

Cuestiones relacionadas