Rolf b: Summe und JOIN

Beitrag lesen

Ich sag jetzt nix neues, mache aber ein paar Beispiele :)

Da Du zwischen Sales und Support keine 1:1 Beziehung hast, muss mindestens eine der beiden Summen falsch sein. Ein JOIN paart "passende" Zeilen aus zwei Tabellen und das Ergebnis sind kombinierte Zeilen mit den Daten aus beiden passenden Zeilen. In deinem Fall passen auf jede Sales Zeile sieben Support-Zeilen, d.h. du bekommst 21 Ergebniszeilen, in denen sich jeder Sale sieben Mal wiederholt und jeder Support dreimal.

Aber selbst in dem Fall, dass Du eine 1:n Beziehung zwischen Sales und Support hättest (also zu jedem Supportsatz immer genau einen Sales-Satz), hast Du bei drei Supports zu einem Sale diesen Sale dann dreimal im Ergebnis. Und deswegen auch dreimal in der Summe.

JOIN ist hier also definitiv nicht dein Freund.

Du hast drei Möglichkeiten. Die REPLACEs lass ich in meinem Beispielen mal weg...

(1) zwei getrennte Queries, die Tage und Stunden einzeln summieren. Nachteil: Du fliegst zwei Runden über den SQL Server.

(2) ein UNION. Dabei musst Du nur achtgeben, dass Du nicht Tage und Stunden addierst.

SELECT X.Art, SUM(X.Wert) as Wert
FROM (
   SELECT 'MD' as Art, A.SoldManDays as Wert FROM Sales WHERE AufNumber = 'Test123'
  UNION
   SELECT 'SH' as Art, A.SupportHours as Wert FROM Support WHERE AufNumber = 'Test123'
) X
GROUP BY X.Art

Ob du den X Namen brauchst, weiß ich nicht, das hängt ggf. vom SQL Server ab. Auf diese Weise bekommst Du zwei Sätze, einen mit Manntagen und einen mit Supportstunden.

(3) Ein SELECT SELECT. Der liefert Dir eine Ergebniszeile mit zwei Spalten, also eigentlich das, was Du willst.

SELECT (SELECT SUM(SoldManDays) FROM SALES s WHERE s.AufNumber = 'Test123') AS SoldManDays,
       (SELECT SUM(SoldManDays) FROM SUPPORT p WHERE p.AufNumber = 'Test123') AS SupportHours

Was Du davon wählst, dürfte Geschmackssache sein. Nr. 1 ist auf jeden Fall am langsamsten (weil zwei Server-Roundtrips), kann aber bei großen Datenmengen besser für die Last am SQL Server sein weil die einzelnen Queries weniger aufwändig sind. Ob es zwischen 2 und 3 Unterschiede in der Last am SQL Server gibt, weiß ich nicht.

Gruß Rolf