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

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top