SQL multiple GROUP BY représenté dans une seule ligne

Cette question est demandée à partir de l'environnement SQL Server. J'ai trouvé plusieurs suggestions ici pour créer une requête qui incorpore plusieurs critères GROUP BY , mais tous produisent plusieurs lignes basées sur les critères du second groupe. Par exemple si mon dataset dans la table TrendingData ressemble à:

 ID SEND HL7 MessageControl STAT DATE CREATED DATE UPDATED 4 AMC1 A03 A03918604B6-4272-40E6-9178-1D711FB135461 P 2015-12-15 12:01:19.153 2015-12-15 12:01:20.137 5 AMC1 A08 A08918604B6-4272-40E6-9178-1D711FB135462 P 2015-12-15 12:01:20.137 2015-12-15 12:01:20.153 6 UHC1R A08 A0893126369-10D1-4506-9A42-B9A7E0AC96151 R 2015-12-15 12:01:34.433 2015-12-15 12:01:34.497 7 UHC1R A03 A03C2468021-8C66-4BAD-A6A7-CBCA02125D411 R 2015-12-15 12:02:38.293 2015-12-15 12:02:38.450 8 UHC1R A08 A08C2468021-8C66-4BAD-A6A7-CBCA02125D412 P 2015-12-15 12:02:38.450 2015-12-15 12:02:38.760 9 UHC1 A08 A0863D0A3D8-402C-4377-9C77-63518A42A11D1 P 2015-12-15 12:02:42.730 2015-12-15 12:02:43.057 

Ensuite, le résultat de la requête

 SELECT COUNT(*) AS Counts, STAT, CONVERT(CHAR(5), DateCreated, 10) AS Date FROM TrendingData GROUP BY STAT, CONVERT(CHAR(5), DateCreated, 10) ORDER BY Date; 

renvoie la sortie comme (et ces nombres proviennent de l'set de données de la table, pas seulement les quelques lignes ci-dessus):

 Counts STAT Date 4488 P 12-15 27568 R 12-15 

Mais ce que je préfère, c'est une sortie qui ressemble à:

 Total CodeP CodeR Date 32056 4488 27568 12-15 

Je suis assez sûr que la colonne CodeP serait peuplée par une variante de count(*) from TrendingDate where STAT = 'P' , mais je n'arrive pas à get la syntaxe correcte pour que la requête tienne trois counts dans le même rendez-vous amoureux.

Suggestions?

Tout ce que vous devez faire est d'utiliser une instruction CASE dans votre fonction d'agrégation COUNT pour les counts P et R , et supprimer la colonne STAT du GROUP BY :

 SELECT COUNT(*) AS Total, COUNT(CASE WHEN stat = 'P' THEN 1 END) AS CodeP, COUNT(CASE WHEN stat = 'R' THEN 1 END) AS CodeR, CONVERT(CHAR(5), DateCreated, 10) AS Date FROM TrendingData GROUP BY CONVERT(CHAR(5), DateCreated, 10) ORDER BY Date;