SQL: Come faccio a restituire zeri dove non c'è nulla di aggregare tutto?
Domanda
Quello che vorrei chiedere è meglio illustrato con un esempio, in modo da portare con me. Supponiamo che io ho la seguente tabella:
TypeID Gender Count
1 M 10
1 F 3
1 F 6
3 M 11
3 M 8
Vorrei aggregare questo per ogni possibile combinazione di TypeID e sesso. Dove TypeID può essere 1,2 o 3 e di genere può essere M o F. Quindi quello che voglio è la seguente:
TypeID Gender SUM(Count)
1 M 10
1 F 9
2 M 0
2 F 0
3 M 19
3 F 0
Mi vengono in mente un paio di modi per potenzialmente fare questo, ma nessuno di loro sembra particolarmente elegante per me.
Qualche suggerimento sarebbe molto apprezzato!
Karl
Soluzione
Usa tabelle per creare le righe da restituire deriva e lasciato unirsi per ottenere i conteggi. Utilizzare COALESCE per trasformare qualsiasi NULL conta in zeri.
SELECT TypeIds.TypeId, Genders.Gender, COALESCE(SUM(T1.Count), 0)
FROM (
SELECT 1 AS TypeId
UNION ALL
SELECT 2
UNION ALL
SELECT 3
) AS TypeIds
CROSS JOIN (
SELECT 'M' AS Gender
UNION ALL
SELECT 'F'
) AS Genders
LEFT JOIN Table1 AS T1
ON TypeIds.TypeId = T1.TypeId AND Genders.Gender = T1.Gender
GROUP BY TypeIds.TypeId, Genders.Gender
Potrebbe essere opportuno prendere in considerazione la creazione di questi genere e tipo tavoli ID del database in modo che si può aderire con loro. Se l'elenco di ID di tipo consentite potrebbe cambiare in futuro, allora si avrà solo per aggiornare la tabella, invece di tutte le query che hanno la lista hard-coded di valori.
Altri suggerimenti
Che ne dite di creare una tabella temporanea che conterrà i record che non sono inclusi sulla vostra tavola poi fare questo script?
SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)
FROM <TABLE>
GROUP BY TypeID, Gender