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]
War es hilfreich?

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]
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top