SQL Statistik mit mehreren IDs

EuroCent

Klappstuhl 2.0
Hallo zusammen,

ich kann mir sicherlich vorstellen dass es solch eine Anfrage schon gab, aber hatte kein Beitrag gefunden.
Oder Ich bin zu Doof dazu :D

Ich habe folgende SQL (MSSQL, TSQL, SSQL):
SQL:
/* GESAMT über alle Listen */
SELECT
    SUM(CASE WHEN [schutz] = 0 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as offen,
    SUM(CASE WHEN [schutz] = 1 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as inarbeit,
    SUM(CASE WHEN [schutz] = 2 AND [status_id] = 6 AND [grund_id] IN(6) THEN 1 ELSE 0 END) as erledigt
FROM
    [statistik_listen]

Mit dem bekomme Ich für die ganzen Listen auf die Gewünschten Werte.

Jetzt benötige Ich aber für jede Liste [listen_id] die entsprechenden Werte.
Ohne dabei x-SQLs zu steuern.

Erst dachte Ich an eine for/While-schleife.
Aber Ich weiß dass es die Möglichketi schon via SQL gibt. :/

Ich komm nur nicht drauf und weiß auch nicht mehr wie es war :D

Hat hier jemand eine Idee?

PS: die listen_id ist in der selbigen Tabelle wie die anderen Felder. :)
 
Zuletzt bearbeitet:
Die Listen sind alle via ID ersichtlich.
In der oberen SQL ist sie nicht hinterlegt da Ich aktuell nicht weiß wie Ich sie genau abrufen kann :)

Hatte auch über legt diese Anweisung zu nutzen:

SQL:
SELECT
    SUM(CASE WHEN [schutz] = 0 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as offen,
    SUM(CASE WHEN [schutz] = 1 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as inarbeit,
    SUM(CASE WHEN [schutz] = 2 AND [status_id] = 6 AND [grund_id] IN(6) THEN 1 ELSE 0 END) as erledigt
FROM
    [statistik_listen]
    INNER JOIN [dbo].[liste] ON([listen_id] = [liste_id])

Das hier hab Ich eben noch heraus gefunden:
SQL:
SELECT
    [liste_id],
    SUM(CASE WHEN [schutz] = 0 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as offen,
    SUM(CASE WHEN [schutz] = 1 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END) as inarbeit,
    SUM(CASE WHEN [schutz] = 2 AND [status_id] = 6 AND [grund_id] IN(6) THEN 1 ELSE 0 END) as erledigt
FROM
    [statistik_listen]
    INNER JOIN [dbo].[liste] ON([listen_id] = [liste_id])
GROUP BY [liste_id]

Jetzt hätte ich 2 Anfragen (Gesamt und Pro Liste).
Ist es auch möglich die 2 Anfragen zu einer zu Kombinieren? :)

Falls Ja wie müsste es dann aussehen? :)

Ergebnis wäre:
liste_id offen inarbeit erledigt
1 46 0 4
2 21 0 0
 
Mach deine Abfrage als View. Dann kannst du die Summe aus dessen Resultat nehmen.

Wenn TSQL oder MSSQL den Befehl WITH analog zu Oracle kennt, dann kannst du das sogar in eine View packen. Ich kenne aber weder TSQL och MSSQL gut genut um zu wissen ob es sowas gibt.

SQL:
-- Oracle Code
WITH t_detail AS (
    SELECT
        [liste_id],
        CASE WHEN [schutz] = 0 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END as offen,
        CASE WHEN [schutz] = 1 AND [status_id] = 2 AND [grund_id] IN(0, 1, 2, 3, 4, 5) THEN 1 ELSE 0 END as inarbeit,
        CASE WHEN [schutz] = 2 AND [status_id] = 6 AND [grund_id] IN(6) THEN 1 ELSE 0 END as erledigt
    FROM
        [statistik_listen]
        INNER JOIN [dbo].[liste] ON([listen_id] = [liste_id])
)
SELECT 'per Liste' AS type, SUM(offen) AS offen, SUM(inarbeit) AS inarbeit, SUM(erledigt) AS erledigt
FROM t_detail
GROUP BY liste_id
UNION ALL
SELECT 'Total', NULL, SUM(offen), SUM(inarbeit), SUM(erledigt)
FROM t_detail;
 
Zurück