[SQL Query Optimierung] Alternative zu 100erten UNION

rauchmelder

Mitglied
Liebe tutorials - Gemeinde,

vl. hat ja der eine oder andere Spezialist eine Idee für mich wie ich meinen Lösungsansatz optimieren kann.

Anwendung:
Der Benutzer wählt aus einer Liste mit mehreren hundert Einträgen beliebig viele aus.
Diese Einträge beinhalten Zeilenweise unter anderen eine Artikelnummer und eine Menge.
Über die ausgewählten Artikel soll jetzt eine akummulierte Summe der benötigten Bestandteile erstellt werden.

Abstraktes Beispiel:
Auftragsliste
Code:
Artikelnummer | Artikelbezeichnung | Menge
1             | Auto               | 2
2             | Fahrrad            | 5
3             | Motorrad           | 4
4             | Dreirad            | 10

Stückliste:
Code:
Bestandteilnummer | Artikelnummer | Bestandteilbezeichnung | Menge
1                 | 1             | Reifen                 | 4
1                 | 2             | Reifen                 | 2
1                 | 3             | Reifen                 | 2
1                 | 4             | Reifen                 | 3
2                 | 1             | Hupe                   | 1
2                 | 2             | Hupe                   | 1
2                 | 3             | Hupe                   | 1
2                 | 4             | Hupe                   | 1

Zwischen-Ergebnis:
2x Auto => 8 Reifen + 2 Hupen
5x Fahrrad => 10 Reifen + 5 Hupen
4x Motorrad => 8 Reifen + 4 Hupen
10x Dreirad => 30 Reifen + 10 Hupen

Wenn nun alle 4 Zeilen ausgewählt werden dann würde folgendes Ergebnis kommen
Code:
Bestandteilnummer | Bestandteilbezeichnung | Menge
1                 | Reifen                 | 56
2                 | Hupe                   | 21
Würde man aber nur Zeile 1 und 2 auswählen:
Code:
Bestandteilnummer | Bestandteilbezeichnung | Menge
1                 | Reifen                 | 18
2                 | Hupe                   | 7

Ich hoffe ich konnte die Problemstellung gut verständlich erklären.

Nun zur aktuellen (vl. nicht so tollen) Lösung:

Code:
SELECT  Bestandteilnummer, Bestandteilbezeichnung, SUM(Menge) FROM (
  SELECT Bestandteilnummer, Bestandteilbezeichnung, Menge * 2 FROM Stückliste WHERE Artikelnummer = 1
  UNION
  SELECT Bestandteilnummer, Bestandteilbezeichnung, Menge * 5 FROM Stückliste WHERE Artikelnummer = 2
  UNION
  SELECT Bestandteilnummer, Bestandteilbezeichnung, Menge * 4 FROM Stückliste WHERE Artikelnummer = 3
  UNION
  SELECT Bestandteilnummer, Bestandteilbezeichnung, Menge * 10 FROM Stückliste WHERE Artikelnummer = 4
)
GROUP BY Bestandteilnummer, Bestandteilbezeichnung;

So im kleinen sieht das noch gut aus, ich hab auch die Abstraktion deutlich vermindert, die eigentliche Abfragen haben einige Joins,... (die Datenbank ist nicht von mir designed teilweise fehlen Indizies und habe auch nur Lesezugriff) aus diesem Grund wäre die Frage wie kann man das sinnvoll optimieren ohne Eingriffe in die Datenbank zu unternehmen?

Irgendjemand eine Idee?

Vielen Dank für die Unterstützung!

Liebe Grüße,

rauchmelder
 
Du hast den Faktor ja in der Auftragsliste
SQL:
SELECT 
	s.Bestandteilnummer, 
	s.Bestandteilbezeichnung, 
	SUM(s.Menge * a.menge)
FROM 
	Stückliste AS s
	INNER JOIN Auftragsliste AS a
		ON s.Artikelnummer  = a.Artikelnummer 
GROUP BY
	s.Bestandteilnummer, 
	s.Bestandteilbezeichnung
 
Zuletzt bearbeitet von einem Moderator:

Neue Beiträge

Zurück