Announcement

Collapse
No announcement yet.

Cross Join in Spalten

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

  • Cross Join in Spalten

    Hallo Community,

    für einen Report benötige ich ein ungewöhnliches SQL Statement.

    Ich möchte ein Kartesisches Produkt über Spalteninhalte erzeugen in dieser Form:

    Grundlage:
    Spalte 1 Spalte 2
    Wert1 Wert2
    Wert3 Wert4
    Nun möchte ich einen Wert "Alle" untermogeln und folgendes Resultat erreichen.

    Ziel:
    Spalte 1 Spalte 2
    Wert1 Wert2
    Wert3 Wert4
    Alle Wert2
    Alle Wert4
    Wert1 Alle
    Wert3 Alle
    Hat jemand eine Idee?

  • #2
    [HIGHLIGHT=SQL]SELECT Spalte1, Spalte2 FROM Tabelle
    UNION ALL
    SELECT 'Alle', Spalte2 FROM Tabelle
    UNION ALL
    SELECT Spalte1, 'Alle' FROM Tabelle[/HIGHLIGHT]

    Comment


    • #3
      Ahhh stimmt, danke

      Comment


      • #4
        Das ist kein CROSS JOIN, du kannst es mit einem CUBE Group machen, z.B. so:

        [HIGHLIGHT=sql]
        WITH t AS
        (SELECT NVL(Spalte_1, 'Alle') AS Spalte_1, NVL(Spalte_2, 'Alle') AS Spalte_2,
        GROUPING_ID(Spalte_1, Spalte_2) gcp,
        GROUPING(Spalte_1) AS Spalte_1_group,
        GROUPING(Spalte_2) AS Spalte_2_group
        FROM Grundlage
        GROUP BY CUBE (Spalte_1, Spalte_2))
        SELECT *
        FROM t
        WHERE gcp < 3 -- oder WHERE Spalte_1_group + Spalte_2_group <= 1;
        [/HIGHLIGHT]

        "GROUP BY CUBE" oder "GROUP BY ROLLUP" ist nur eine Abkürzung (sowohl was die Tipparbeit als auch für die Antwortzeit von der DB betrifft) für den "UNION ALL" Konstrukt.
        Nur zur Veranschaulichung, diese beiden SELECT liefen exakt das gleiche, die erste Variante ist nur kürzer und schneller:

        [HIGHLIGHT=sql]
        SELECT Spalte_1, Spalte_2
        FROM Grundlage
        GROUP BY CUBE (Spalte_1, Spalte_2);


        SELECT Spalte_1, Spalte_2 FROM Grundlage GROUP BY Spalte_1, Spalte_2
        UNION ALL
        SELECT NULL, Spalte_2 FROM Grundlage GROUP BY Spalte_2
        UNION ALL
        SELECT Spalte_1, NULL FROM Grundlage GROUP BY Spalte_1;
        UNION ALL
        SELECT NULL, NULL FROM Grundlage GROUP BY NULL;
        [/HIGHLIGHT]


        Gruss
        Zuletzt editiert von Wernfried; 30.10.2015, 13:52.

        Comment


        • #5
          Sehr gut,
          vielen Dank für eure Hilfe.

          Comment

          Working...
          X