Announcement

Collapse
No announcement yet.

Gruppieren, Bedingung innerhalb einer Gruppe

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

  • Gruppieren, Bedingung innerhalb einer Gruppe

    Hallo,

    ich benötige Hilfe bei einer SQL Abfrage:
    Die Ausgangsdaten:
    A 7
    A 7
    B 8
    B null
    C null
    C null

    2 Spalten. Die erste Spalte zeigt 3 Gruppen: A, B und C. (Es gibt natürlich noch mehr Gruppen). Nun möchte ich drei Ergebnisse:

    Alle Werte aus Spalte 1 die innerhalb der Gruppe KEIN NULL Wert in Spalte 2 haben.
    Alle Werte aus Spalte 1 die innerhalb der Gruppe mind. einen Null Wert haben und einen Nicht Null Wert.
    Alle Werte aus Spalte 1 die innerhalb der Gruppe NUR NULL Werte in Spalte 2 haben.

    In der Praxis sind Spalte eins DublettenIDs und diese Dubletten haben jeweils einen Verweis in der zweiten Spalte.

    Habt herzlichen Dank
    Sebastian1234

  • #2
    Hallo Sebastian,

    hier eine mögliche Beispiel-Lösung. Man könnte es auch über JOINs lösen, statt über die Sub-Selects; da muss man dann sehen, was performanter ist.

    Die Lösung lautet übrigens A B C
    [highlight=sql]
    CREATE TABLE #tmp (Grp char(1), Wert int);
    INSERT INTO #tmp VALUES('A', 7);
    INSERT INTO #tmp VALUES('A', 7);
    INSERT INTO #tmp VALUES('B', 8);
    INSERT INTO #tmp VALUES('B', null);
    INSERT INTO #tmp VALUES('C', null);
    INSERT INTO #tmp VALUES('C', null);
    GO

    -- Alle Werte aus Spalte 1 die innerhalb der Gruppe
    -- KEIN NULL Wert in Spalte 2 haben.
    SELECT DISTINCT Grp
    FROM #tmp
    WHERE NOT GRP IN
    (SELECT Grp
    FROM #tmp
    WHERE Wert IS NULL);

    -- Alle Werte aus Spalte 1 die innerhalb der Gruppe mind.
    -- einen Null Wert haben und einen Nicht Null Wert.
    SELECT DISTINCT Grp
    FROM #tmp
    WHERE Grp IN
    (SELECT Grp
    FROM #tmp
    WHERE Wert IS NULL)
    AND Grp In
    (SELECT Grp
    FROM #tmp
    WHERE NOT Wert IS NULL);

    -- Alle Werte aus Spalte 1 die innerhalb der Gruppe
    -- NUR NULL Werte in Spalte 2 haben.
    SELECT DISTINCT Grp
    FROM #tmp
    WHERE Grp IN
    (SELECT Grp
    FROM #tmp
    WHERE Wert IS NULL)
    AND NOT Grp In
    (SELECT Grp
    FROM #tmp
    WHERE NOT Wert IS NULL);

    GO
    DROP TABLE #tmp;
    [/highlight]
    Olaf Helper

    <Blog> <Xing>
    * cogito ergo sum * errare humanum est * quote erat demonstrandum *
    Wenn ich denke, ist das ein Fehler und das beweise ich täglich

    Comment


    • #3
      Hallo,

      da JOINs sehr oft (in aller Regel?) schneller sind als Unterabfragen, versuche ich mich mal daran:

      Teil 1 von Olafs Antwort sieht dann vermutlich so aus:
      [highlight=sql]SELECT DISTINCT Grp
      FROM #tmp t1
      JOIN #tmp t2
      on t1.Grp = t2.Grp
      WHERE t2.Wert IS NULL;[/highlight]
      Ohne Gewähr, ich habe es nur so hingeschrieben und nicht getestet.

      Die Teile 2 und 3 sind etwas komplexer wegen der doppelten Bedingungen, sollten aber so ähnlich gehen.

      Ich hoffe, ich habe mich nicht verrannt. Gruß Jürgen

      Comment


      • #4
        Hallo O. Helper

        herzliche Dank!
        Dein Beispiel funktioniert bei mir perfekt. (ms-sql2008)
        Ich habe es auch erweitert und es klappt.

        Allerdings klappt in meinem Praxis Fall nur die Abfrage Null und NICHT Null in einer Gruppe. Die beiden anderen liefern mir null Zeilen.
        Kopiere ich dann meine Anfrage mit in dein Beispiel geht es wiederum...

        Also nur NULL und nur NICHT NULL liefern 0 Zeilen.
        Es gibt aber Ergebnisse ich sehe es ja in der Tabelle.

        Könnte es daran liegen das meine WERT spalte eine UID Spalte ist?
        Meine GRP Spalte ist eine Integer Spalte das sollte egal sein...

        ---EDIT---
        Vielleicht ist das der Grund: "Achten Sie auf NULL-Werte! Wenn die von Ihnen mit einem NOT IN Prädikat verwendete Unterabfrage nur für eine einzige Zeile in der Menge einen NULL-Wert zurückliefert, ist das Ergebnis der NOT IN Operation nie TRUE. Stattdessen wird es immer unbestimmt sein." (O Reillys SQL - Kurz und Gut S.113)

        Ja ich habe ein Buch aber ich wäre ich nicht auf das IN Prädikat gekommen... einfach noch zu wenig Erfahrung...

        Warum klappt aber das Beispiel so gut?
        ---EDIT---


        Grüße
        Sebastian1234

        PS: Danke Jürgen: Teste ich gleich aus!
        Zuletzt editiert von sebastian1234; 09.01.2010, 12:29.

        Comment


        • #5
          Achten Sie auf NULL-Werte! Wenn die von Ihnen mit einem NOT IN Prädikat verwendete
          Das Problem kann nur entstehen, wenn es in Grp NULL Werte gibt; die kannst Du aber problemlos raus filter mit

          WHERE NOT Grp IS NULL
          Olaf Helper

          <Blog> <Xing>
          * cogito ergo sum * errare humanum est * quote erat demonstrandum *
          Wenn ich denke, ist das ein Fehler und das beweise ich täglich

          Comment

          Working...
          X