Compter les lignes pour deux colonnes en utilisant deux clauses différentes

Je suis après un CTE que je veux returnner deux colonnes, une avec le nombre total de 1 et un avec le nombre total de 0. Actuellement, je peux l'get pour returnner une colonne avec le nombre total de 1 en utilisant:

WITH getOnesAndZerosCTE AS ( SELECT COUNT([message]) AS TotalNo1s FROM dbo.post WHERE dbo.checkletters([message]) = 1 --SELECT COUNT([message]) AS TotalNo0s --FROM dbo.post --WHERE dbo.checkletters([message]) = 0 ) SELECT * FROM getOnesAndZerosCTE; 

Comment puis-je avoir une deuxième colonne appelée TotalNo0s dans le même CTE que j'ai commenté là pour montrer ce que je veux dire.

Utilisation de l'agrégation conditionnelle:

 WITH getOnesAndZerosCTE AS( SELECT TotalNo1s = SUM(CASE WHEN dbo.checkletters([message]) = 1 THEN 1 ELSE 0 END), TotalNo0s = SUM(CASE WHEN dbo.checkletters([message]) = 0 THEN 1 ELSE 0 END) FROM post ) SELECT * FROM getOnesAndZerosCTE; 

Pour utiliser COUNT () directement, sachez qu'il count toutes les valeurs NON-NULL. Vous pouvez omettre la condition ELSE qui renvoie implicitement NULL si elle n'est pas indiquée

 SELECT COUNT(CASE WHEN dbo.checkletters([message]) = 1 THEN 1 END) TotalNo1s , COUNT(CASE WHEN dbo.checkletters([message]) = 0 THEN 1 END) TotalNo0s FROM post 

ou, indiquer explicitement NULL

 SELECT COUNT(CASE WHEN dbo.checkletters([message]) = 1 THEN 1 ELSE NULL END) TotalNo1s , COUNT(CASE WHEN dbo.checkletters([message]) = 0 THEN 1 ELSE NULL END) TotalNo0s FROM post 

Vous pouvez le faire sans CTE

 select count(message) total, dbo.checkletters(message) strLength from post group by dbo.checkletters(message) having dbo.checkletters(message) in (1, 2) //All the messages with length 1 or 2