Announcement

Collapse
No announcement yet.

Abfrageproblem - UNION für eine Spalte + Zweite 'mitschleppen'?

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

  • Abfrageproblem - UNION für eine Spalte + Zweite 'mitschleppen'?

    Hallo!

    Folgende Tabelle ohne Schlüssel:
    Code:
    SektionID | List | Quantity | Median
    Zu jeder SektionID kann es mehrere Listen geben (n:m), Mit einer Anzahl an vorhandenen Einträgen und einem Median.

    Ich möchte bestimmte SektionIDen erhalten, die verschiedenen Abfragen genügen, Beispielsweise:
    Alle SektionIDen-IDs mit:
    Code:
    (
    Mindestens 5 Einträgen aus List_100
    UND
    Mindestens 3 Einträgen aus List_105
    )
    ODER
    (
    Mindestens 10 Einträgen aus List_200
    UND
    KEINEM Eintrag aus List_110
    )
    Wobei wenn kein Eintrag für die Liste vorhanden ist in der Tabelle auch kein Eintrag existiert, Quantity = 0 gibt es also nicht.

    Nun muss ich aber noch das Average des Median GENAU DIESER Tupel prüfen.

    Solche Abfragen ließen sich per EXISTS und NOT EXISTS umsetzen, was aber grottig langsam ist.
    Deutlich schneller war mein Ansatz mit UNION und INTERSECT, allerdings kann ich da den Median nicht mitschleppen..:
    Code:
    SELECT SektionID FROM
    (
    (SELECT SektionID FROM xyz WHERE List = 100 AND Quantity >= 5)
    INTERSECT
    (SELECT SektionID FROM xyz WHERE List = 105 AND Quantity >= 3)
    ...usw.
    Code:
    )
    GROUP BY SektionID HAVING avg(Median) >= ...
    Der innere Block liefert genau die SektionIDen-Einträge, die ich benötige, allerdings brauche ich für die treffenden Tupel eben noch den Median Wert und SELECT SektionID,Median FROM ... geht nat. nicht, da der UNION/INTERSECT ja über alle Spalten geht.

    Die Abfragekombinationen müssen für statistische Abfragen sehr variabel sein und sind Kombinationen aus mehr oder weniger vielen AND / OR / NOT..

    Wie kann ich das umsetzen? Die SektionID hilft nicht, da ja weitere Listen zu einer SektionID gehören können und so den avg(Median) verfälschen würden.

    Ein anderer Ansatz war etwa folgender, hat mir aber gar nicht gefallen:
    Code:
    SELECT SektionID FROM
    (
     (
      SELECT SektionID FROM xyz (WHERE List = 100 AND Quantity >= 5) OR (List = 105 AND Quantity >= 3)
      GROUP BY SektionID HAVING count(*) = 2 AND avg(Median) >= ...
      )
    )
    Dies natürlich für jeden 'zusammenhängenden' AND-Block und count(*) = x eben entsprechend der Anzahl verknüpfter Listen.

    Wäre toll wenn Ihr ein paar Vorschläge hättet die jedoch durchaus noch mehr oder weniger performant sein müssten

    Vielen, vielen Dank im Vorraus!

    Grüße,
    Mark

  • #2
    Dann musst du den Median mit selektieren, in etwa
    Code:
    SELECT SektionID, Median FROM
    (
    (SELECT SektionID, Median FROM xyz WHERE List = 100 AND Quantity >= 5)
    INTERSECT
    (SELECT SektionID, Median FROM xyz WHERE List = 105 AND Quantity >= 3)
    )
    GROUP BY SektionID HAVING avg(Median) >= ...
    Bei SQL-Code bitte beachten: Formatierung von SQL in Beiträgen

    Comment


    • #3
      Hallo,
      das geht ja nicht, da er den Median mit vergleicht, der ist aber je nach 'List' verschieden, also werden 'korrekte' Ergebnisse verworfen.
      Hatte ich in meinem langen Text unter dem vorletzten Code-Abschnitt schon geschrieben

      Oder verstehe ich etwas falsch?

      Gruß,
      Mark

      Comment

      Working...
      X