MS SQL: select mit count und rollup - NULL vs NULL

DaRealMC

Erfahrenes Mitglied
Hallo,

ich hoffe, dass ich es schaffe, mein Problem klar zu machen.
Aus einer Abfrage mit Count und Group by bekomme ich auch Null-Werte für die Gruppierung zurück. So weit alles klar und OK.
Jetzt brauche ich aber auch noch ein rollup() und habe dann zwei Zeilen mit NULL | $Anzahl
Baue ich jetzt z.B. ein isnull() ein, habe ich halt am Ende zwei Zeilen mit bla | $Anzahl

Wie schaffe ich es, dass ich das Null, nach dem ursprünglich gruppiert wurde und was so tatsächlich in der DB steht, als "" angezeigt wir und das andre als "Summe"?

Beim Versuch danach zu googeln bekomme ich immer nur genau diesen isnull-Weg, der mir ja aber nicht wirklich hilft.
 
Einfacher gesagt als getan...
Code:
select * from
(select datum as Monat,COALESCE(v.Text,'') as v.Text, count (*) as Anzahl from item i,klasse k,vermerk v
where i.id = k.id
and i.id2 = v.id
group by rollup(v.Text), datum)

) as temp where monat is not null
order by Monat asc,v.Text asc,anzahl desc
hoffentlich habe ich jetzt richtig verallgemeinert
 
Zuletzt bearbeitet:
Ich habs!

Code:
select * from
(select datum as Monat,
ISNULL(v.Text, CASE WHEN GROUPING(v.Text) = 0 THEN '' ELSE 'Summe' END)
  AS v.Text, count (*) as Anzahl from item i,klasse k,vermerk v
where i.id = k.id
and i.id2 = v.id
group by rollup(v.Text), datum)

) as temp where monat is not null
order by Monat asc,v.Text asc,anzahl desc

Trotzdem Danke :)
 
item: Dein SQL hat eine ) zuviel.

item: Du hast in deinem Äusseren Query ein Tabellenalias aus dem Subquery mit drin. Das geht nicht.

item: Sorry, ich versteh die Frage immer noch nicht

item: Du hast ein Alias v.text. Ein Alias kann keine Quellangabe mit Puinkt haben
Hier mal dein SQL FORMATIERT und lesbar. Inkl. Kommentaren zu den Fehler

Nun gut, es ist MS SQL und das kenne ich nicht, aber ich glaube die aufgezählten Fehler müssten auch bei MS SQL Fehler sein

SQL:
SELECT 
    * 
FROM 
    (
        SELECT 
            datum AS monat, 
            -- Fehlerhafter Alias
            COALESCE(v.text, '') AS v.text, 
            COUNT (*) AS anzahl 
        FROM 
            item i, 
            klasse k, 
            vermerk v 
        WHERE 
            i.id = k.id 
            AND i.id2 = v.id 
        GROUP BY 
            ROLLUP(v.text), 
            datum
    -- Nächste Zeile beinhaltet ein ), welches zuviel ist
    )
    )AS temp 
WHERE 
    monat IS NOT NULL 
ORDER BY 
    monat ASC, 
    -- v ist ein Alias aus dem Subquery. Ist hier ungültig
    v.text ASC, 
    anzahl DESC

Vom Konzept her würde ich so vergehen.
Im SubQuery die 2 Gruppierungsfelder mit IFNULL() oder COALESCE() auf 0 bzw. '' umformen. Auch im GROUP BY-Teil!
Dann im Äusseren mit IFNULL() oder COALESE() den Null-Text auf "Summe" wechseln.

Hier die Lösung, wie ich sie in MySQL umsetzen würde (ungetestet) Du musst es aber noch auf MS SQL umschreiben
SQL:
SELECT 
    temp.monat,
    COALESCE(temp.new_text, 'Summe')    AS text
    temp.anzahl
FROM 
    (
        SELECT 
            COALESCE(datum, 0)      AS monat, 
            COALESCE(v.text, '')    AS new_text, 
            COUNT (*)               AS anzahl 
        FROM 
            item i, 
            klasse k, 
            vermerk v 
        WHERE 
            i.id = k.id 
            AND i.id2 = v.id 
        GROUP BY 
            -- Ich lass den ROLLUP mal so stehen, in der Annahme dass er in MS SQL so angewendet wird
            ROLLUP(COALESCE(v.text, '')), 
            COALESCE(datum, 0)
    )AS temp
 

Neue Beiträge

Zurück