AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Select mit SubSelect summieren

Select mit SubSelect summieren

Ein Thema von uwewo · begonnen am 16. Apr 2007 · letzter Beitrag vom 20. Apr 2007
Antwort Antwort
Seite 2 von 2     12
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Select mit SubSelect summieren

  Alt 19. Apr 2007, 13:27
Hallo Thorsten,

wenn ich das ganze richtig verstehe, vergibst Du dem SubSelect einen Namen in diesem Fall "x" bzw. "y", nette Idee wusste nicht das dies überhaupt möglich ist.

Wenn ich mir die Selects von innen nach aussen anschaue, verstehe ich das ganze sogar
Leider erhalte ich immer wieder die gleiche Fehlermeldung, "Unknown column x.artnr in on clause"
egal wie rum ich es versuche.

ON x.ArtikelNr = y.ArtikelNr) x ON y.ArtikelNr = x.ArtikelNr) x In jedem Fall ist x.artnr der Fehler. Desweiteren verstehe ich nicht ganz, dass sowohl beim Subselect

SQL-Code:
FROM (SELECT SUM(GutStueck) as menge
            FROM tagesproduktion
            GROUP BY ArtikelNr) x
sowie auch beim

ON x.ArtikelNr = y.ArtikelNr) x ein x am Ende steht. Vielleicht kann mir das ja jemand erklären.
Uwe
  Mit Zitat antworten Zitat
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, 21: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
uwewo

Registriert seit: 14. Jul 2004
Ort: Karlsruhe
479 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Select mit SubSelect summieren

  Alt 20. Apr 2007, 07:14
Hallo Thorsten,

bis auf Dein lettzes "x" hatte ich auch alles vorher verstanden.
Natürlich habe ich auch jedes SELECT einzeln ausprobiert und auch das mit der Namensgebung, wegen doppelt vorhandener Feldbezeichnungen in verschiedenen Tabellen war mir klar.

Das man Subselects auf diese Weise Alias-Namen zuweisen kann, war mir allerdings neu und es freut mich immer wieder etwas neues zu lernen.

Allerdings bin ich mir zu 100% sicher das die Feldnamen meiner Query, mit denen in den Tabellen übereinstimmen daher mein letztes Posting.

Na ja wird wohl doch an MySQL 4.11 liegen.

Ich DANKE Dir aber trotzdem für die ganze Mühe die Du dir gemacht hast.

Ausserdem habe ich auch wieder etwas dazu gelernt, was man nicht unterschätzen sollte.

Schönes Wochenende
Uwe
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz