Rolf Rost: Anzahl der der Einträge eines Lieferanten

Hallo;

möglicherweise sehe ich den Wald vor lauter Bäumen nicht..., also:
es gibt eine tabelle mit lieferanten und artikeln

L  Artikel
-------------
1  graukappe
1  rotkappe
2  grauhut
2  rothut
2  grünhut
2  blauhut
3  grünmütze
3  graumütze

Die SQL Query soll das hier ergeben (sortiert nach Anzahl der Artikel pro Lieferant):

L  Artikel    Anzahl
--------------------
2  grauhut    4
2  rothut     4
2  grünhut    4
2  blauhut    4
1  graukappe  2
1  rotkappe   2
3  grünmütze  2
3  graumütze  2

Wobei: Anzahl soll also die Anzahl der in der Tabelle vorhandenen Einträge enthalten <= wie oft steht der Lieferant in der Tabelle, bzw.: Mit wieviel verschiedenen Artikeln ist der vertreten.

Das Problem: count(Artikel...) verlangt nach einer GROUP BY - Klausel, und normalerweise kann ich damit nur
sowas erreichen:

L  Anzahl_Artikel
-------------------
1  2
2  4
3  2

Bitte also um Hilfe, wie obenstehendes Ergebnis erreicht werden kann.

Viele Grüße, Rolf

  1. Hallo Rolf!

    So in etwa müsste es hinhauen:

    select Lieferant, Artikel, Count(*) as Anzahl
    from blabla
    group by Artikel, Lieferant
    order by Anzahl;

    lg

    norbert =:-)

    1. Hi,

      select Lieferant, Artikel, Count(*) as Anzahl
      from blabla
      group by Artikel, Lieferant
      order by Anzahl DESC;

      Mist, haette ich auch gewusst!   ;-)

      Gruss,
      Ludger

      1. Hallo Ludger!

        Mist, haette ich auch gewusst!   ;-)

        Schau ma mal, ob's auch die gewünschte Lösung war. Das DESC hab ich natürlich absichtlich weggelassen, damit Rolf noch was zum grübeln hat :-)

        lg

        norbert =:-)

        1. Hallo  liebe Mitstreiter,

          nun, es ergibt leider nicht das gewünschte Ergebnis (Anzahl ist in jeder Zeile => 1).

          Viele Grüße, Rolf

          1. Hallo Rolf!

            Mit dieser Info allein werden wir nicht weiter kommen. Gibts einen Teil der Daten und einen Teil der Ausgabe als Hilfe?

            lg

            norbert =:-)

          2. Hallo Rolf!

            Offenbar habe ich die Aufgabe nicht richtig verstanden. Ich habe mir die Ausgangstabelle nachgebastelt und mit meinem Select abgefragt und genau das gewünschte Ergebnis erzielt.

            Irgendwas dürfte ich also missverstanden haben - sorry. Eine Lösung hast Du ja in der Zwischenzeit - trotzdem hat mir das Problem irgendwie keine Ruhe gelassen.

            lg

            norbert =:-)

            ==============================
            Hier die Testdaten, falls sowas mal jemand in den Tiefen des Foren-Archivs sucht:

            1 graukappe
            1 rotkappe
            1 blaukappe
            1 graukappe
            1 graukappe
            1 rotkappe
            2 graukappe
            2 rotkappe
            2 blaukappe
            2 blaukappe
            2 rotkappe
            2 blaukappt
            3 graukappe
            3 rotkappe
            3 rotkappe
            3 blaukappe
            3 rotkappe
            3 graukappe
            3 graukappe

            Und hier das Ergebnis:

            SELECT Lieferant, Artikel, Count(*) AS Anzahl
            FROM Artikeldaten
            GROUP BY Artikel, Lieferant
            ORDER BY Anzahl DESC, Lieferant;

            L Artikel   Anzahl
            1 graukappe 3
            3 rotkappe  3
            3 graukappe 3
            1 rotkappe  2
            2 rotkappe  2
            2 blaukappe 2
            1 blaukappe 1
            2 graukappe 1
            2 blaukappt 1
            3 blaukappe 1

            1. yo,

              Hier die Testdaten, falls sowas mal jemand in den Tiefen des Foren-Archivs sucht:

              deine testdaten sind falsch....

              Ilja

              1. Hallo Ilja!

                deine testdaten sind falsch....

                Ein guter Einwand - aber warum? Ich weiß schon, dass ich nicht 1:1 die Daten von Rolf genommen habe - für die Logik sollte dies allerdings egal sein.

                Für das Problem von Rolf ist es nebensächlich - persönlich bin ich jetzt aber schon sehr interessiert zu erfahren, wo ich den Denkfehler habe.

                lg

                norbert =:-)

                1. yo,

                  Ein guter Einwand - aber warum? Ich weiß schon, dass ich nicht 1:1 die Daten von Rolf genommen habe - für die Logik sollte dies allerdings egal sein.

                  ganz und gar nicht. deine methode war, erst eine select-anweisung zu entwickeln und dann die testdaten so zu verändern, dass du auf das passende ergebnis kommst. das alleine bedarf eigentlich keiner weiteren diskussion, dass man das so nicht machen kann. schließlich will er eine passende abfrage auf seinen bestehenden datenpool und nicht deine daten übernehmen, damit deine abfrage klappt.

                  aber davon mal abgesehen, machst du auch in deiner abfrage logische fehler. du gruppierst sowohl über den lieferanten als auch über die artikel. das hat zur folge, dass du die gleichen dantensätze mehrfach in die tabelle einbauen musst, damit der count die anzahl der unterschiedlichen artikel eines lieferanten funktioniert.

                  Ilja

                  1. Hallo Ilya!

                    Ist ja alles gut und schön - aber was ist an diesen Daten jetzt anders als an meinen (angeblich zurechtgestrickten)? Unterschiedliche Artikel, welche unterschiedlichen Lieferanten zugeordnet sind.

                    L  Artikel
                    -------------
                    1  graukappe
                    1  rotkappe
                    2  grauhut
                    2  rothut
                    2  grünhut
                    2  blauhut
                    3  grünmütze
                    3  graumütze

                    Offenbar bin ich aber wirklich zu blöd für diese vermeintlich einfach Aufgabenstellung. Beenden wir also dieses Thema - vielleicht geht mir ein Licht auf, wenn ich darüber geschlafen habe :-)

                    lg

                    norbert =:-)

                    1. yo,

                      nimm doch einfach mal die daten von ralf und lasse deine abfrage darüber fahren. du wirst als count nur den wert 1 erhalten. dann kannst du darüber nachdenken, was genau dein group by über zwei spalten bewirkt.

                      Ilja

                      1. Hallo Ilja!

                        Jetzt hab ichs begriffen :-D

                        Vielleicht sollte man solch hochgeistige Threads nicht nach einer ziemlich kurzen Nacht angehen.

                        Vielen Dank auf jeden Fall,

                        lg

                        norbert =:-)

      2. Hi Ludger,

        Mist, haette ich auch gewusst!   ;-)

        Glaub ich nie.....

        Viele Grüße
        Mathias Bigge

  2. Hallo,

    möglicherweise sehe ich den Wald vor lauter Bäumen nicht..., also:
    es gibt eine tabelle mit lieferanten und artikeln

    L  Artikel

    1  graukappe
    1  rotkappe
    2  grauhut
    2  rothut
    2  grünhut
    2  blauhut
    3  grünmütze
    3  graumütze

    Die Tabelle hat also kein eindeutiges Feld? L und Artikel können jeweils beliebig oft und in beliebiger Kombination vorkommen?

    Die SQL Query soll das hier ergeben (sortiert nach Anzahl der Artikel pro Lieferant):

    L  Artikel    Anzahl

    2  grauhut    4
    2  rothut     4
    2  grünhut    4
    2  blauhut    4
    1  graukappe  2
    1  rotkappe   2
    3  grünmütze  2
    3  graumütze  2

    Das geht nicht mit einer Query, weil die "Datensätze" im Resultat keinen direkten Bezug zu Tabelle mehr haben. Im Prinzip stellt Dein Resultat die Tabelle, sprich jeden Datensatz einzeln) nur anders sortiert dar und fügt jedem Datensatz die Anzahl L gruppiert nach L an.

    So etwas kann man mit Hilfe eines Self-JOINs machen.

    SELECT Tabelle.L AS Lief, Tabelle.Artikel, Tabelle2.Anzahl
    FROM Tabelle INNER JOIN (Select L, count(*) as Anzahl from Tabelle group by L) as Tabelle2 on Tabelle.L = Tabelle2.L order by Anzahl DESC;

    Ob MySQL so etwas kann, weiß ich nicht.

    viele Grüße

    Axel

    1. Hallo Axel,

      Die Tabelle hat also kein eindeutiges Feld? L und Artikel können jeweils beliebig oft und in beliebiger Kombination vorkommen?

      So ists.

      So etwas kann man mit Hilfe eines Self-JOINs machen.

      In diese Richtung hab ich vorhin auch schonmal gedacht, da kam aber was dazwischen... , nun, dank Deiner Hilfe und mit

      SELECT Tabelle.L AS Lief, Tabelle.Artikel, Tabelle2.Anzahl
      FROM Tabelle INNER JOIN (Select L, count(*) as Anzahl from Tabelle group by L) as Tabelle2 on Tabelle.L = Tabelle2.L order by Anzahl DESC;

      Hat es funktioniert - Danke!!!

      Das ist richtig Klasse, es ergibt genau das was ich gerne hätte und es geht primär nicht nur ums Sortieren nach der Anzahl sondern auch darum, nach anderen Spalten (die ich schon hab) sortieren zu können, je nach Benutzereingaben (das Weitere ist dann klar wies geht). Nun können wir auch nach der Anzahl sortieren - COOL!

      Schönes Wochenende und viele Grüße aus Karlsruhe
      Rolf

      1. Hi again,

        kleiner Nachtrag noch: Obs mit MySQL auch geht, weiß ich auch nicht, meine engine heißt Postges ;-)

        Viele Grüße, Rolf

      2. yo,

        sollte auch folgendermaßen funktionieren:

        SELECT Tab1.L as Lieferant, Tab1.Artikel,
        (SELECT COUNT(*) FROM Tabelle as Tab2 WHERE Tab2.L=Tab1.L) AS Anzahl
        FROM Tabelle AS Tab1 ORDER BY 3, 1, 2

        Ilja