Question

Ce que je voudrais poser est le mieux illustré par un exemple, donc supporter avec moi. Supposons que j'ai le tableau suivant:

TypeID  Gender      Count
1       M           10
1       F           3
1       F           6  
3       M           11
3       M           8

Je voudrais regrouper ce pour toutes les combinaisons possibles de TypeID et le sexe. Où TypeID peut être 1,2 ou 3 et le sexe peut être M ou F. Donc, ce que je veux est la suivante:

TypeID  Gender      SUM(Count)
1       M           10
1       F           9
2       M           0  
2       F           0
3       M           19
3       F           0

Je peux penser à quelques façons de le faire potentiellement, mais aucun d'entre eux semblent particulièrement élégant pour moi.

Toutes les suggestions seraient grandement appréciés!

Karl

Était-ce utile?

La solution

Utilisez les tables dérivées pour créer les lignes à retourner et à gauche se joindre pour obtenir les comptes. Utilisez COALESCE pour transformer tout NULL en compte des zéros.

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

Il pourrait être utile d'envisager la création de ces tables sexe et le type d'identification dans votre base de données afin que vous puissiez joindre à eux. Si la liste des ids de type autorisé pourrait changer à l'avenir, alors vous devrez seulement mettre à jour la table au lieu de toutes les requêtes qui ont la liste codée en dur des valeurs.

Autres conseils

Comment créer autour d'une table temporaire qui contient les enregistrements qui ne figurent pas sur votre table puis faites ce script?

SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)  
  FROM <TABLE> 
GROUP BY TypeID, Gender
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top