Einzelnen Beitrag anzeigen

omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#12

Re: Select mit SubSelect summieren

  Alt 19. Apr 2007, 20:15
Hallo uwewo,

ok ich versuche mal etwas Klarheit hier reinzubringen.

Wenn man schreibt...
SQL-Code:
SELECT x.spalte
FROM tabelle x
dann gibt man der tabelle einen Prefix (x) über den man dann auf die Spalten der Tabelle zugreifen kann.
Man könnte auch den Prefix weglassen und einfach den vollständigen Tabellennamen schreiben.
SQL-Code:
SELECT tabelle.spalte
FROM tabelle
Das ist mir allerdings zu umständlich.

Diese Prefix bzw. Tabellenangabe beim Spaltennamen ist allerdings nur dann nötig wenn man mehrere Tabellen auf einer Ebene hat, die die selben Spaltennamen haben. Damit man eben die Spalte die man meint eindeutig angeben kann.

Wenn man jetzt eine Unterabfrage anstatt einer realen Tabelle nimmt, verhält es sich ähnlich. Ich muss auf den Dateninhalt zugreifen können. Bei einer realen Tabelle gibt es schon einen Namen (den Tabellennamen) diesen kann ich auch durch einen Prefix ersetzen. Bei einer Unterabfrage ist diese Namenvergabe ein muss, da die Unterabfrage natürlich keinen Namen hat. Deshalb muss hier immer ein Prefix angegeben werden.
SQL-Code:
SELECT *
FROM (SELECT *
      FROM tabelle) x
Das X nehme ich meist aus reiner Faulheit.

Schauen wir uns jetzt die innerste Abfrage an...
SQL-Code:
SELECT artnr, SUM(menge) menge
FROM oee_produktion
GROUP BY artnr
da in deiner Produkt-Tabelle ein Produkt mehrfach vorkommen kann (nur mal nebenbei: das DB-Design ist nicht gerade elegant) fasse ich hier alle Artikel zusammen und bilde aus den Einzelsummen eine Gesamtsumme pro Artikel.

Dieses Ergebnis nehme ich und verarbeite es weiter...
SQL-Code:
SELECT teilnr, x.menge * y.menge AS multiplikant
FROM (SELECT artnr, SUM(menge) menge
      FROM oee_produktion
      GROUP BY artnr) x
INNER JOIN oee_stcklist y
  ON x.artnr = y.artnr
hier wird jetzt die Stückliste zu jedem Artikel hinzugejoint und Mengen multipliziert.
Aus Faulheit habe ich meine beiden Ergebnismengen X und Y genannt.

Dieses Ergebnis nehme ich und verarbeite es wieder weiter...
SQL-Code:
SELECT teilnr, SUM(multiplikant) summe
FROM (SELECT teilnr, x.menge * y.menge AS multiplikant
      FROM (SELECT artnr, SUM(menge) menge
            FROM oee_produktion
            GROUP BY artnr) x
      INNER JOIN oee_stcklist y
        ON x.artnr = y.artnr) x
GROUP BY teilnr
da ich die oben erstellte Abfrage in die neue einbette kann ich einfach wieder den gleichen Prefix nehmen, weil es eine neue Ebene ist. Auf einer Ebene kann natürlich jeder Prefix nur einmal vorkommen. Da ich hier aber eine neue Ebene aufmache kann ich einfach wieder mit X weiter machen. Man kann auch jeden anderen Prefix nehmen. Also zum Beispiel so...
SQL-Code:
SELECT teilnr, SUM(multiplikant) summe
FROM (SELECT teilnr, x.menge * y.menge AS multiplikant
      FROM (SELECT artnr, SUM(menge) menge
            FROM oee_produktion
            GROUP BY artnr) x
      INNER JOIN oee_stcklist y
        ON x.artnr = y.artnr) z
GROUP BY teilnr
Das Kind muss nur einen Namen bekommen.

Ich hoffe ich konnte dir das verständlich rüberbringen.

Deine Fehlermeldung sagt einfach nur aus, das die Spalte nicht vorhanden ist. Die Spalten heissen vielleicht etwas anders in deinen Tabellen, das must du dann anpassen.

Probier einfach die einzelnen Abfragen aus und baue sie dann langsam wieder zusammen.

Hoffe das hilft dir weiter.

Gruss
Thorsten
  Mit Zitat antworten Zitat