Mehrere Unions sollen auf subquery zugreifen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Mehrere Unions sollen auf subquery zugreifen

    Hallo Zusammen,

    Habe eine Subquery und moechte diese mehrmals mit Union gruppieren um verschiede Summen vorher auszugeben.
    Problem: Innerhalb jeder Union muss ich dieselbe Query mit den Details angeben.
    Kann stattdessen nicht von allen UNION-Teilen auf eine allgemein gueltige Query zugegriffen werden?
    Bzw. gibt es einen komplett anderen Loesungsansatz?

    Ausgabe soll also z.B. sein (basierend auf 2 x Union):
    **************************************************
    Peter 28 //Summiert und gruppiert auf Name
    Jack 12
    Nora 34

    Montag: 4 //Summiert und gruppiert auf Wochentag
    Dienstag:2
    Mittwoch:1

    Peter Montag 20 //Einzelne Datensaetze
    Peter Mittwoch 8
    Jack Montag 8
    Jack Dienstag 4
    Nora Montag 5
    Nora Montag 5
    Nora Dienstag 24

    ******************************************
    Folgende Query funktioniert (Um zu vereinfachen sind einige Zeilen entnommen, kann also sein dass einige Fehler vorhanden sind. Es geht ja nur ums Prinzip) Frage also --> Wie kann man es umgehen die select qry nach FROM immer wiederholen zu muessen?:
    *****************************************
    // Die Query die die Summe auf Groupierung MName bildet
    Select MName, sum(Pts1)
    From
    (
    SELECT 'A'&format(inDateTime,'YYYYMMDD HH:mm:ss') as Qsort,
    m.Membername as MName,
    e.format(inDateTime,'ddd') as Day,
    e.EntryPaid * 2 as Pts1
    from Entries e
    left join members m on m.MemNo = e.MemNo
    where year(e.inDateTime) = 2012
    )
    Group by MName

    UNION


    // Die Query die die Summe auf Groupierung Day bildet
    Select Day, sum(Pts1)
    From
    (
    SELECT 'B'&format(inDateTime,'YYYYMMDD HH:mm:ss') as Qsort,
    m.Membername as MName,
    e.format(inDateTime,'ddd') as Day,
    e.EntryPaid * 2 as Pts1
    from Entries e
    left join members m on m.MemNo = e.MemNo
    where year(e.inDateTime) = 2012
    )
    Group by Day

    UNION

    // Die Query mit den Details (Beispielsweise alle Datensaetze)
    // --> Hierauf sollten die Selects der anderen Unions zugreifen, das geht
    // aber meines wissens nach nicht. Was waere daher eine Alternative?
    SELECT 'C'&format(inDateTime,'YYYYMMDD HH:mm:ss') as Qsort,
    m.Membername as MName,
    e.format(inDateTime,'ddd') as Day,
    e.EntryPaid * 2 as Pts1
    from Entries e
    left join members m on m.MemNo = e.MemNo
    where year(e.inDateTime) = 2012

    Sort by Qsort

    **************************************
    Also anstatt das obene angegebene eben sowas aehnliches wie unten (Ziel ist also zu verhindern, dass das select statement immer wieder kopiert werden muss):
    ****************************************
    Select sum(Pts1)
    From
    ( DIE-UNTERQUERY)
    Group by MName

    UNION

    Select sum(Pts1)
    From
    ( DIE-UNTERQUERY)
    Group by Day

    UNION

    DIE-UNTERQUERY
    Sort by Qsort

    Hoffe das ist zu verstehen!...

    Gruss
    D

  • #2
    Als erstes kannst du dein Subquery mal reduszieren.
    Code:
    -- Dein SQL 
    Select Day, sum(Pts1)
    From
    (
    SELECT 'B'&format(inDateTime,'YYYYMMDD HH:mm:ss') as Qsort,
    m.Membername as MName,
    e.format(inDateTime,'ddd') as Day,
    e.EntryPaid * 2 as Pts1
    from Entries e
    left join members m on m.MemNo = e.MemNo
    where year(e.inDateTime) = 2012
    )
    Group by Day
    -- Lässt sich zu dem folgenden reduzieren
    SELECT 
        format(e.inDateTime,'ddd') AS Day,
        SUM(e.EntryPaid * 2) AS Pts1
    FROM 
        entries e
    WHERE 
        year(e.indatetime) = 2012
    Group by
        Day
    Aber zurück zu deiner Frage. Ändere die Reihenfolge. Zuerst den UNION und dann den GROUP BY
    Code:
    SELECT
        value,
        SUM(pts1) AS pts1
    FROM
        (
            -- Nach Name
            SELECT
                m.membername as mname AS value,
                e.entrypaid * 2 as pts1
            FROM 
                entries e
                LEFT JOIN members m 
                ON m.memno = e.memno
            WHERE 
                YEAR(e.indatetime) = 2012
            UNION ALL
            -- Nach Wochentag
            SELECT 
                format(e.inDateTime,'ddd') AS value,
                SUM(e.EntryPaid * 2) AS Pts1
            FROM 
                entries e
            WHERE 
                year(e.indatetime) = 2012
            Group by
                Day
        )
    GROUP by    
        value
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)

    Kommentar

    Lädt...
    X