2012-10-11 23 views
5

He pasado unos buenos 20 minutos buscando respuestas similares pero la mayoría no están especificadas para las bases de datos MS Access.Uniones internas múltiples con MS Access que producen resultados múltiples. Necesitan agrupar y sumar

Desafortunadamente mi experiencia de SQL es muy limitada, por lo que agradecería su opinión al respecto.

Puede descargar la base de datos de acceso desde este enlace aquí para ver lo que estoy tratando de lograr TestDB.zip.

Esta imagen muestra una configuración de la tabla muy básico como un ejemplo en MS Access 2003, de lo que se desea lograr:
enter image description here

Básicamente me gustaría ejecutar una consulta SQL que mostrará los pedidos con todo el información contenida en las tablas relacionadas.

Obviamente, una consulta SQL como la que se muestra a continuación mostrará varias filas con información repetida que no es lo que quiero.

SELECT Orders.OrderID, Orders.OrderTitle, Materials.Material, Materials.MaterialCost, 
     Labour.HoursTaken, Invoices.InvoiceAmount 
    FROM ((Orders INNER JOIN Labour ON Orders.OrderID = Labour.OrderID) 
       INNER JOIN Materials ON Orders.OrderID = Materials.OrderID) 
INNER JOIN Invoices ON Orders.OrderID = Invoices.OrderID; 

Resultados:
enter image description here

Básicamente, me gustaría una consulta que resumir cada uno de los materiales, las horas y las facturas para cada orden. Algo que he producido en esta hoja de cálculo como se desea se puede ver aquí:
enter image description here

Obviamente, este SQL no funciona porque las cifras son por todo el lugar, debido a las múltiples filas debido a la combinaciones internas.

SELECT Orders.OrderID, Orders.OrderTitle, Sum(Materials.MaterialCost) AS SumOfMaterialCost, 
     Sum(Labour.HoursTaken) AS SumOfHoursTaken, 
     Sum(Invoices.InvoiceAmount) AS SumOfInvoiceAmount 
    FROM ((Orders INNER JOIN Labour ON Orders.OrderID = Labour.OrderID) 
       INNER JOIN Materials ON Orders.OrderID = Materials.OrderID) 
INNER JOIN Invoices ON Orders.OrderID = Invoices.OrderID 
GROUP BY Orders.OrderID, Orders.OrderTitle; 

resultados aquí:
enter image description here

me han mirado las instrucciones SELECT múltiples, pero no creo que éstas son compatibles con MS Access

+0

Sería más fácil/preferible publicar las estructuras de la tabla, los datos de muestra y los resultados de la consulta aquí en lugar de en un archivo .zip almacenado en otro lugar. Si el enlace del archivo .zip falla alguna vez, esta información se perderá al hacer esta pregunta difícil de entender. – Taryn

+0

No solo eso, sino que anteriormente publicó esta pregunta y luego la eliminó [aquí] (http://stackoverflow.com/questions/12819833/multiple-inner-joins-with-ms-access-producing-multiple-results-need -agrupación) (solo 10k +). Si no obtiene una respuesta a una pregunta, considere revisarla y no volver a publicar una nueva. – Taryn

+0

Publiqué el archivo zip que contiene el ejemplo Access DB y la estructura de la tabla con este nuevo envío. Eliminé la publicación anterior y volví a enviarla para no confundir a las personas con dos publicaciones. – user1734790

Respuesta

3

subconsultas le conseguirá lo que busca :

SELECT O.OrderID, O.OrderTitle, 
    (SELECT Sum(M.MaterialCost) FROM Materials AS M 
    WHERE M.OrderID=O.OrderID) AS SumOfMaterialCost, 
    (SELECT Sum(L.HoursTaken) FROM Labour AS L 
    WHERE L.OrderID=O.OrderID) AS SumOfHoursTaken, 
    (SELECT Sum(I.InvoiceAmount) FROM Invoices AS I 
    WHERE I.OrderID=O.OrderID) AS SumOfInvoiceAmount 
FROM Orders AS O 

Ver Subquery Basics y Surviving Subqueries para algunos más buena información.

+0

Ohhhh, está casi ahí ... Puse el código SQL, pulso ejecutar y me piden que ingrese un valor de parámetro. Si quito la parte de la línea superior me sale el total que trabaja GRAN SELECT (select sum (M.MaterialCost) de los materiales como M = DONDE M.OrderID O.OrderID) AS SumOfMaterialCost, (select sum (L.HoursTaken) desde el trabajo AS L DONDE L.OrderID = O.OrderID) AS SumOfHoursTaken, (select sum (I.InvoiceAmount) de las facturas AS I DONDE I.OrderID = O.OrderID) AS SumOfInvoiceAmount partir de las órdenes AS O' ... pero todavía necesito al menos el Nº de referencia. – user1734790

+0

Está bien. Lo arreglé reemplazando el 'SELECT Orders.OrderID, Orders.OrderTitle' por' SELECT O.OrderID, O.OrderTitle. Muchas gracias por tu ayuda. ¡Es enormemente apreciado! – user1734790

+0

Perdón por eso. Actualicé mi respuesta en consecuencia para futuros usuarios. – mwolfe02

Cuestiones relacionadas