Willkommen bei Entwickler-Forum.
Seite 1 von 2 1 2 LetzteLetzte
Ergebnis 1 bis 10 von 14
  1. #1
    Neuer Benutzer
    Registriert seit
    19.12.2017
    Beiträge
    7

    Standard join auf gleiche Tabelle

    Hallo

    ich habe folgende Abfragen die auch jeweils die benötigten Informationen liefern.

    Code SQL:
    SELECT   
    b.kunden_nr AS Nummer,
    a.name1 AS Name ,
    COUNT (b.auftrag_nr) AS Anzahl2016 ,
    b.abteilung AS Abteilung  
    FROM adress a, sendungen b
    WHERE  b.betrieb IN(1,2) AND a.konto = b.kunden_nr 
    AND b.ladetag BETWEEN '2016-11-01' AND '2016-11-30' 
    AND b.abteilung = 'TKEU'
    GROUP BY Nummer, Name, Abteilung
    ORDER BY  Anzahl2016 DESC;
    und
    Code SQL:
    SELECT   
    b.kunden_nr AS Nummer,
    a.name1 AS Name ,
    COUNT (b.auftrag_nr) AS Anzahl2017 ,
    b.abteilung AS Abteilung  
    FROM adress a, sendungen b
    WHERE  b.betrieb IN(1,2) AND a.konto = b.kunden_nr 
    AND b.ladetag BETWEEN '2017-11-01' AND '2017-11-30' 
    AND b.abteilung = 'TKEU'
    GROUP BY Nummer, Name, Abteilung
    ORDER BY  Anzahl2017 DESC;

    wenn ich nun versuche die Tabelle Sendungen per join zu verknüpfen, damit die Anzahl2016 und die Anzahl2017 nebeneinander stehen, dann hab ich da einen Knoten im Kopf.
    Entweder sind in beiden Feldern die Anzahl identisch oder es kommt gar nichts.

    Das auszugebende Ergebnis sollte wie folgt aussehen.

    Nummer, Name, Anzahl2016, Anzahl2017, Abteilung


    Wie wäre hier der richtige join?

    Danke
    Geändert von ssc (19.12.2017 um 17:11 Uhr)

  2. #2
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.307

    Standard

    Step 1
    Beide Abfragen mit Klammern versehen und einen Alias anhängen, dann über die Kundennummer joinen und in der Ausgabe nur noch eine der KNR Spalten, plus die beiden Spalten für die Jahre aufnehmen.
    Versuch mal, wird schon klappen.

    P.S: Plus 1x das Namensfeld und Abteilung
    Gruß, defo

  3. #3
    Neuer Benutzer
    Registriert seit
    19.12.2017
    Beiträge
    7

    Standard

    Hallo defo,

    die Ausgaben sind doch schon im select definiert.
    Ich versteh nicht was gemeint ist?

    Gruß
    ssc

  4. #4
    Stammgast
    Registriert seit
    26.02.2003
    Beiträge
    4.841

    Standard

    Das hilft aber nicht das die in diesen selects angegeben Kundendaten bereits vorhanden sind. Man kann sie leider nicht direkt benutzen.

    Wir müssen annehmen das nicht jeder Kunde in jedem Jahr Daten hat. Heißt beim join (wenn du tatsächlich die Datenbankoperation join meinst und nicht umgangssprachlich von join sprichst) muss man berücksichtigen das die Daten für 2016 oder 2017 null sind. Heißt man müßte einen Full Outer Join benutzen was die Sache sehr hässlich macht.
    Beispiel. Kunde hatte Daten in 2016 aber nicht in 2017. Dann willst du die Kundendaten aus dem ersten SQL. Umgekehrt Kunde hat Daten in 2017 aber nicht in 2016. Dann willst du die Kundendaten aus dem zweiten SQL.

    Wenn du uns dein konkret verwendete Datenbanksystem verrätst können wir vermutlich was sinnvolles empfehlen. Das dann auch wahrscheinlich auch nicht join basiert ist.

    Und als weitere Info solltest du uns verraten wie die Daten verteilt sind. Also werden immer Daten für einen Kunden in 2016 und 2017 vorhanden sein. Oder möglicherweise nur in einem der beiden Jahre. Oder ist es vielleicht sogar so das du den Kunden auch sehen willst wenn er in keinem der beiden Jahren Daten hat und dann halt mit einer Null in den beiden Spalten mit der Anzahl?

  5. #5
    Neuer Benutzer
    Registriert seit
    19.12.2017
    Beiträge
    7

    Standard

    Hallo Ralf,

    vielen Dank für die ausführlichere Anfrage.

    1. die Tabelle Sendungen beinhaltet u.a. die Felder
    - kunden_nr
    - tag
    - auftrag_nr
    - abteilung
    2. die Tabelle adress beinhaltet die kompletten Adressfelder wobei mit der kunden_nr aus sendungen auf die Konto_nr in adressen zugegriffen wird

    ein Kunde kann im abgefragten Zeitraum 2016 x-Sendungen haben und im Vergleichszeitraum 2017 keine
    ein andere Kunde kann im Zeitraum 2017 y-Sendungen haben dafür im Vergleichszeitraum 2016 keine
    Kunden die in beiden Zeiträumen keine Sendungen haben sollen nicht angezeigt werden.

    Daher hatte ich eigentlich nur das Hauptaugenmerk auf die Tabelle Sendungen.
    Die Tabelle Adress kam nur dazu damit man nicht überlegen muss wer ist beispielsweise die Kundennummer 12345.

    Ich hoffe, dass es so verständlicher ist, was ich als Ergebnis anzeigen möchte.

  6. #6
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.307

    Standard

    Zitat Zitat von ssc Beitrag anzeigen
    vielen Dank für die ausführlichere Anfrage.
    Das war keine Anfrage, sondern eine Erklärung.
    Wir wissen noch nicht, was Dein Datenbanksystem ist.


    Was ich in Step1 vorgeschlagen habe, war ganz stumpf folgendes:
    Code SQL:
    SELECT * FROM 
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2016, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '2016-11-01' AND '2016-11-30'
              AND b.abteilung = 'TKEU'
            GROUP BY Nummer, name, Abteilung
            ORDER BY Anzahl2016 DESC
          ) x     JOIN  
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2017, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '2017-11-01' AND '2017-11-30'
              AND b.abteilung = 'TKEU'
            GROUP BY Nummer, name, Abteilung
            ORDER BY Anzahl2017 DESC
          ) y
        ON x.kunden_nr = y.kunden_nr

    Das ist eine sehr simple Lösung, die ein mögliches Vorgehen zeigt.
    Das Order By ergibt in der Form keinen Sinn, der Join wird einige Deiner Datensätze verschlucken, die Spalten sind doppelt, mglw. leer, jenachdem wie man den Join anlegt (left, right, outer), das Abfrageverhalten (Ausführungsplan) ist nicht optimiert.

    Step 2, 3, 4, 5 .. könnte das verbessern.
    Gruß, defo

  7. #7
    Neuer Benutzer
    Registriert seit
    19.12.2017
    Beiträge
    7

    Standard

    Hallo,

    mein DB System ist eine Informix IDS 11.70.


    Ich habe dann mal den obigen bearbeiteten Select ausprobiert und bekomme hier die gleiche Melldung die ich in meinen Versuchen auch schon hatte

    294: The column (nummer) must be in the GROUP BY list.

    Im JOIN fehlen wohl doch noch ein paar Informationen.
    Wenn man dann den Group By nach dem Join hinzufügt, dann kommt die Meldung auch.
    Geändert von ssc (20.12.2017 um 10:53 Uhr)

  8. #8
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.307

    Standard

    Zitat Zitat von ssc Beitrag anzeigen
    Hallo,
    - mein DB System ist eine Informix IDS 11.70.
    - .. bekomme hier die gleiche Melldung
    294: The column (nummer) must be in the GROUP BY list.
    - Im JOIN fehlen wohl doch noch ein paar Informationen.
    - Wenn man dann den Group By nach dem Join hinzufügt, dann kommt die Meldung auch.
    Ich weiß nicht genau, was Informix so beim Group by haben will, wenn die Feldnamen per Alias ausgegeben werden. Ich kenne es so, dass es eher die Originalnamen sind, versuch es mal so:
    Code SQL:
    SELECT * FROM 
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2016, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '2016-11-01' AND '2016-11-30'
              AND b.abteilung = 'TKEU'
            GROUP BY b.kunden_nr, a.name1, b.abteilung
            ORDER BY Anzahl2016 DESC
          ) x     JOIN  
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2017, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '2017-11-01' AND '2017-11-30'
              AND b.abteilung = 'TKEU'
            GROUP BY b.kunden_nr, a.name1, b.abteilung
          ) y
        ON x.kunden_nr = y.kunden_nr

    Fehlermeldungen sind immer gut, vor allem in einem solchen Post hier. Kann man am besten direkt zu Anfang angeben.
    Welche Informationen fehlen denn im Join?
    Und wenn etwas fehlt, was hat das mit Group by zu tun?
    Gruß, defo

  9. #9
    Neuer Benutzer
    Registriert seit
    19.12.2017
    Beiträge
    7

    Standard

    Zitat Zitat von defo Beitrag anzeigen
    Ich weiß nicht genau, was Informix so beim Group by haben will, wenn die Feldnamen per Alias ausgegeben werden. Ich kenne es so, dass es eher die Originalnamen sind, versuch es mal so:

    Fehlermeldungen sind immer gut, vor allem in einem solchen Post hier. Kann man am besten direkt zu Anfang angeben.
    Welche Informationen fehlen denn im Join?
    Und wenn etwas fehlt, was hat das mit Group by zu tun?
    Die beiden einzelnen Selects bringen die Meldung nicht.
    Erst wenn diese im Select mit dem Join zusammengebunden wurden kommt die Meldung.

    Die Meldung kam bei meinen einzelnen Selects auch als ich nur die
    Code SQL:
    SELECT ....
    FROM ....
    WHERE ....
    Abfrage hatte. nach dem zufügen von GROUP BY und später ORDER BY .... DESC kam das erste Ergenis wie es sein sollte.

    Dann bei der 2. Abfrage gleich alles eingefügt, dann kam auch hier ohne Fehler-Meldungen die korrekte Anzeige.

    Daher weiß ich nicht welchen Fehler ich posten sollte.
    Meine Frage war ja wie ich beide Abfragen so zusammen bringe, dass ich, wie oben schon geschrieben, die Anzeige bekomme, dass

    die KundenNr, der Name, die Anzahl2016, die Anzahl2017

    geordnet nach Anzahl2016 angezeigt werden.

  10. #10
    Stammgast
    Registriert seit
    24.10.2011
    Beiträge
    1.307

    Standard

    Ja, die Aufgabe ist klar.
    Was unklar ist, welches Problem gehört zu welchem Select.

    Ich habe allerdings geschlampt und im join Kriterium den Alias nicht berücksichtigt.
    Code SQL:
    SELECT * FROM 
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2016, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '01.11.2016' AND '30.11.2016'
              AND b.abteilung = 'TKEU'
            GROUP BY b.kunden_nr, a.name1, b.abteilung
            ORDER BY Anzahl2016 DESC
          ) x     JOIN  
          (SELECT b.kunden_nr AS Nummer, a.name1 AS name,
                  COUNT(b.auftrag_nr) AS Anzahl2017, b.abteilung AS Abteilung
             FROM adress a, sendungen b
            WHERE b.betrieb IN (1, 2)
              AND a.konto = b.kunden_nr
              AND b.ladetag BETWEEN '01.11.2017' AND '30.11.2017'
              AND b.abteilung = 'TKEU'
            GROUP BY b.kunden_nr, a.name1, b.abteilung
          ) y
        ON x.Nummer = y.Nummer

    Gibt es immer noch Fehlermeldungen zu genau diesem Select Statement?
    Geändert von defo (20.12.2017 um 12:22 Uhr)
    Gruß, defo

 

 
Seite 1 von 2 1 2 LetzteLetzte

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •