Announcement

Collapse
No announcement yet.

Spezielle GROUP BY-Abfrage gesucht

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

  • Spezielle GROUP BY-Abfrage gesucht

    Hallo zusammen,

    ich bin auf der Suche nach der richtigen SQL-Abfrage, um aus der folgenden vereinfachten Tabelle

    Code:
    Produkt | Version | Wert
    --------|---------|------
    A       | 1       | NULL
    A       | 2       | 33
    A       | 3       | 99
    B       | 1       | NULL
    B       | 2       | NULL
    B       | 3       | 77
    B       | 4       | NULL
    B       | 5       | 22
    für jedes Produkt jeweils nur den von NULL verschiedenen Wert mit der kleinsten Versions-Nummer als Ergebnis der gesuchten SQL-Abfrage zu erhalten, d.h.

    Code:
    Produkt | Wert
    --------|------
    A       | 33
    B       | 77
    Wäre klasse, wenn jemand einen genialen Einfall dazu hätte.

    Danke im Voraus, Jan

  • #2
    Originally posted by HAL2001 View Post
    Wäre klasse, wenn jemand einen genialen Einfall dazu hätte.
    genial nicht, trivial schon
    [HIGHLIGHT="SQL"]WITH Data (Produkt, Version, Wert) AS

    (SELECT 'A', 1, NULL UNION ALL
    SELECT 'A', 2, 33 UNION ALL
    SELECT 'A', 3, 99 UNION ALL
    SELECT 'B', 1, NULL UNION ALL
    SELECT 'B', 2, 77 UNION ALL
    SELECT 'B', 4, NULL UNION ALL
    SELECT 'B', 5, 22
    )
    SELECT D.Produkt, D.Wert
    FROM (
    SELECT Produkt
    , MIN(Version) AS MinVersion
    From Data
    WHERE Wert IS NOT NULL
    GROUP BY Produkt
    ) AS X
    JOIN Data AS D ON D.Produkt = X.Produkt
    AND D.Version = X.MinVersion

    -- Produkt Wert
    -- ------- -----------
    -- A 33
    -- B 77[/HIGHLIGHT]... und das WITH auch hier nur wieder für die Daten da...

    Comment


    • #3
      Danke für die schnelle Hilfe.

      Meine richtige Tabelle hat jetzt nicht nur eine "Wert"-Spalte, sondern bis zu 20. Wenn ich für alle vorhandenen Wert-Spalten jetzt den Lösungsvorschlag anwende, müßte ich jeweils den Subselect pro Wert-Spalte mit der Tabelle via JOIN verbinden, richtig? Das könnte doch schnell die Performance drücken, oder?

      Ich hätte gedacht, daß es ggf. eine GROUP-Funktion gibt, die das in einer einfachen SELECT für jede Spalte separat lösen könnte, z.B.

      Code:
      SELECT Produkt, MyFunction(Wert1, Version), MyFunction(Wert2, Version) FROM DATA GROUP BY Produkt
      wobei MyFunction aus den zu gruppierenden Daten jeweils den von NULL verschiedenen Wert mit der kleinsten Versionsnummer herausfindet.

      Comment


      • #4
        Hallo,
        Originally posted by HAL2001 View Post
        Meine richtige Tabelle hat jetzt nicht nur eine "Wert"-Spalte, sondern bis zu 20. Wenn ich für alle vorhandenen Wert-Spalten jetzt den Lösungsvorschlag anwende, müßte ich jeweils den Subselect pro Wert-Spalte mit der Tabelle via JOIN verbinden, richtig?
        Ja. (Wobei ich mich schon frage warum du den "Knackpunkt" in der Ursprungsfrage erstmal weglässt )
        Originally posted by HAL2001 View Post
        Das könnte doch schnell die Performance drücken, oder?
        Auch ja.
        Originally posted by HAL2001 View Post
        Ich hätte gedacht, daß es ggf. eine GROUP-Funktion gibt, die das in einer einfachen SELECT für jede Spalte separat lösen könnte,
        Nein, für eine so spezielle Anwendung gibt es natürlich keine vorgefertigte Gruppierungsfunktion.

        Gruß Falk
        Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

        Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

        Comment


        • #5
          Wahrscheinlich gibt es elegantere Wege und geeignete Funktionen,
          allerdings sollte diese Abfrage auch relativ schnell sein.

          Falls du die Ursprungstabelle schon nach "Produkt, Version" sortiert hast,
          solltest du dies nicht nochmal in der Unterabfrage für die jeweilige Spalte "MinWertX" machen.

          Bei einer Tabelle "Ursprungstabelle" mit den Spalten Produkt, Version, Wert1 Wert2, ... könnte die Abfrage so lauten.

          PHP Code:
            SELECT
               a
          .Produkt
              
          ,MinWert1 = (SELECT TOP 1 wert1 FROM Ursprungstabelle w1 Where w1.Produkt a.Produkt AND Wert1 IS NOT NULL ORDER BY ProduktVersion)
              ,
          MinWert2 = (SELECT TOP 1 wert2 FROM Ursprungstabelle w2 Where w2.Produkt a.Produkt AND Wert2 IS NOT NULL ORDER BY ProduktVersion)
          FROM (SELECT DISTINCT
                   Produkt
                   FROM Ursprungstabelle
                   

          Attached Files
          Zuletzt editiert von knoxyz; 28.06.2011, 12:55.
          Und Falk Prüfer sprach: Formatierung von SQL in Beiträgen

          Comment

          Working...
          X