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