SQL-Summe Daten aus mehreren Tabellen
-
25-09-2019 - |
Frage
Ich habe 2 Tabellen AP und INV, wo sowohl die Spalten [PROJECT] und [Wert].
Ich möchte eine Abfrage so etwas wie dies zurück:
PROJECT | SUM_AP | SUM_INV
kam ich unten mit dem Code, aber es sind die falschen Ergebnisse der Rückkehr (Summe ist falsch).
SELECT AP.[PROJECT],
SUM(AP.Value) AS SUM_AP,
SUM(INV.Value) AS SUM_INV
FROM AP INNER JOIN INV ON (AP.[PROJECT] =INV.[PROJECT])
WHERE AP.[PROJECT] = 'XXXXX'
GROUP BY AP.[PROJECT]
Lösung
Die Ergebnisse aus der Abfrage sind falsch, weil die Werte, die Sie versuchen, werden gruppiert zusammenfassen, die doppelte Werte verursacht im SUM
aufgenommen werden.
Sie können es mit ein paar Unter wählt lösen:
SELECT
AP1.[PROJECT],
(SELECT SUM(AP2.Value) FROM AP AS AP2 WHERE AP2.PROJECT = AP1.PROJECT) AS SUM_AP,
(SELECT SUM(INV2.Value) FROM INV AS INV2 WHERE INV2.PROJECT = AP1.PROJECT) AS SUM_INV
FROM AP AS AP1
INNER JOIN INV AS INV1
ON (AP1.[PROJECT] =INV1.[PROJECT])
WHERE AP1.[PROJECT] = 'XXXXX'
GROUP BY AP1.[PROJECT]
Andere Tipps
Wenn Sie N
Reihen in AP mit einer bestimmten Projekt-ID und M
Reihen in INV mit dieser ID haben, dann kommen die zwischen den beiden Tabellen auf der Projekt-ID wird für dieses Projekt insgesamt N*M
Reihen haben, weil die gleichen Zeile in AP wird für jede Zeile in INV wiederholt werden, die das Projekt ID hat, und umgekehrt. Daher, warum Ihre zählt, sind höchstwahrscheinlich aus (weil es die gleiche Zeile in einer Tabelle zu zählen mehrere Male aufgrund der Wiederholung aus dem Join).
Stattdessen möchten Sie vielleicht versuchen, eine zwischen den Ergebnissen von zwei Unterabfragen, ein, welche Gruppen die erste Tabelle durch Projekt-ID verbinden tun und tut, dass seine Summe, und die zweite, welche Gruppen die andere Tabelle von Projekt-ID und macht diese Summe -. dann verbinden, wenn Sie nur 1 Zeile mit Summe für jedes Projekt-ID besitzen
Wenn PROJECT die übergeordnete Tabelle ist, sollten Sie aus dem Projekt-Tabelle auswählen, und machen Sie einen linken äußeren Verknüpfung auf den beiden untergeordneten Tabellen:
SELECT PROJECT.PROJECT_ID, SUM(AP.Value) AS SUM_AP, SUM(INV.Value) AS SUM_INV
FROM PROJECT
LEFT OUTER JOIN AP ON (AP.[PROJECT] = PROJECT.[PROJECT_ID])
LEFT OUTER JOIN INV ON (INV.[PROJECT] = PROJECT.[PROJECT_ID])
WHERE PROJECT.[PROJECT_ID] = 'XXXXX'
GROUP BY PROJECT.[PROJECT_ID]
Sie könnten die beiden Summenberechnungen trennen. Ein Weg, ich mir vorstellen kann ist, die Bestandsberechnung einer Unterabfrage zu bewegen, wie:
SELECT
AP.[PROJECT]
, SUM(AP.Value) AS SUM_AP
, SummedInv as SUM_INV
FROM AP
LEFT JOIN (
SELECT PROJECT, SUM(Value) AS SUM_INV
FROM INV
GROUP BY PROJECT
) SummedInv ON SummedInv.Project = AP.Project
GROUP BY AP.PROJECT, SummedInv.SUM_INV
Da die SummedInv
Unterabfrage auf project
gruppiert ist, ist es sicher zu einer Gruppe auf SummedInv.SUM_INV
in der äußeren Abfrage als auch.
Wie über diese Abfrage:
select SUM(gpCutBody.actualQty) as cutQty , SUM(gpSewBody.quantity) as sewQty
from jobOrder
inner join gpCutHead on gpCutHead.joNum = jobOrder.joNum
inner join gpSewHead on gpSewHead.joNum = jobOrder.joNum
inner join gpCutBody on gpCutBody.gpCutID = gpCutHead.gpCutID
inner join gpSewBody on gpSewBody.gpSewID = gpSewHead.gpSewID
where jobOrder.joNum = '36'
Hier ist der Link zu der ERD: http: // dl.dropbox.com/u/18794525/AUG%207%20DUMP%20STAN.png
Versuchen Sie:
SELECT AP.[PROJECT] AS PROJECT, SUM(AP.[Value]) AS SUM_AP, SUM(INV.[Value]) AS SUM_INV
FROM AP, INV
WHERE AP.[PROJECT] = INV.[PROJECT]
AND AP.[PROJECT] = 'XXXXX'
GROUP BY AP.[PROJECT]