Announcement

Collapse
No announcement yet.

join auf gleiche Tabelle

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • join auf gleiche Tabelle

    Hallo

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

    [highlight=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;
    [/highlight]
    und
    [highlight=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;
    [/highlight]

    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
    Zuletzt editiert von ssc; 19.12.2017, 17:11.

  • #2
    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

    Comment


    • #3
      Hallo defo,

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

      Gruß
      ssc

      Comment


      • #4
        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?

        Comment


        • #5
          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.

          Comment


          • #6
            Originally posted by ssc View Post
            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:
            [HIGHLIGHT=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
            [/HIGHLIGHT]

            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

            Comment


            • #7
              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.
              Zuletzt editiert von ssc; 20.12.2017, 10:53.

              Comment


              • #8
                Originally posted by ssc View Post
                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:
                [highlight=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
                [/highlight]

                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

                Comment


                • #9
                  Originally posted by defo View Post
                  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
                  [HIGHLIGHT=sql]
                  select ....
                  from ....
                  where ....
                  [/HIGHLIGHT]
                  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.

                  Comment


                  • #10
                    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.
                    [highlight=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
                    [/highlight]

                    Gibt es immer noch Fehlermeldungen zu genau diesem Select Statement?
                    Zuletzt editiert von defo; 20.12.2017, 12:22.
                    Gruß, defo

                    Comment


                    • #11
                      Hallo,

                      tut mir leid aber auch wenn man von

                      ON x.kunden_nr = y.kunden_nr

                      auf die Aliase umstellt

                      ON x.Nummer = y.Nummer

                      umstellt, kommt wieterhin die Meldung

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

                      leider kommt nicht mehr als dies, daher kann ich auch nicht sagen wo es fehlen sollte, denn in den einzelnen Selects ist es ja aufgeführt.

                      Du hast geschrieben es gäbe da noch STEP 2...5.
                      Was wären denn hier die Anpassungen, vielleicht ist da etwas dabei, was den Group BY beinhaltet?

                      Vielen Dank für die Geduld und Unterstützung.

                      Comment


                      • #12
                        Originally posted by ssc View Post
                        Hallo,

                        tut mir leid .., kommt wieterhin die Meldung

                        294: The column (nummer) must be in the GROUP BY list.
                        Ich hab leider kein Informix am Start und kenne auch keine online Seite, die das kann.

                        Es gibt m.E. nur 2 Möglichkeiten.
                        - Deine alte Syntax mit Group By Alias Names ist richtig und "einzig" zulässig.
                        oder
                        - Du nimmst nicht das Statement was ich gepostet hab, sondern ein adaptiertes

                        Ein Join zwischen 2 separaten Abfragen, die geklammert sind und mit Alias versehen sind, muss funktionieren (Also das Prinzip, dass ich gezeigt habe). Wenn du das Statement nicht umbauen musst, damit es bei Dir läuft, versuch bitte Deine Originalstatements in mein Gerüst einzusetzen. Das muss gehen und hat auch nichts mit Group by zu tun.
                        Ich kann mir zumindest nicht vorstellen, dass Informix so "eigen" ist.
                        Falls Du aus "Tarngründen" gar nicht die Originalstatements verwendest, ist das alles etwas müßig. Ein Komma oder Klammerfehler bei der Übertragung der Übertragung und man redet total aneinander vorbei.

                        Vielleicht habe ich auch selber grad ein Brett vorm Kopf, aber die Fehlermeldung ergibt für mich keinen Sinn.

                        P.S.: Step 2..5 sind alles dann Umbaumaßnahmen, die es schneller, passender usw. machen.
                        Eigentlich war Step 1 nur zum warm werden.
                        Man kann auch gleich ganz andere Wege beschreiten, aber wenn nicht mal ein join klappt (warum auch immer), scheint mir das nicht sinnvoll, andere Baustellen aufzumachen.
                        Gruß, defo

                        Comment


                        • #13
                          Hallo,

                          so ich hab die Lösung.
                          Beim "GROUP BY" standen erst die Alias Namen,
                          ich hab nun mal den Alias durch die Position also "GROUP BY 1,2,4" ersetzt.
                          Damit läuft der Select dann auch ohne Fehlermeldung durch und dauert so lang (140 row(s) fetched - 484ms (+107ms))

                          Das Ergbnis sieht nun so aus
                          DBEAVER_JOIN.jpg

                          Daher ist der STEP 1 nun erledigt.

                          Den Rest bekomm ich nun wieder so gestalltet das es dann auch meine gewünschte Ansicht ergibt.
                          Ich bedanke mich für die Unterstützung.

                          Comment


                          • #14
                            Ok, schön zu hören.
                            Vergiß bitte nicht, dass dieser Join nur Daten anzeigt, die in beiden Jahren bei beiden Kunden auftauchen.
                            Alles andere geht verloren.

                            Es gibt viele weitere Wege, diese Aufgabe zu lösen bzw. die aktuelle Lösung zu verbessern. Das group by mit feldnummern ist dabei auch nicht die Ideallösung, da es sehr fehleranfällig ist, mindestens ist es nicht wartungsfreundlich. Eigentlich sollte es mit den original Feldnamen auch bzw. sauberer funktionieren.

                            Kannst Dich ja melden, wenn es noch klemmt.
                            Gruß, defo

                            Comment

                            Working...
                            X