使用两个不同的子句计算两列的行数

Count rows for two columns using two different clauses

我在 CTE 之后想要 return 两列,一列包含 1 的总数,另一列包含 0 的总数。目前,我可以使用以下方法将其添加到 return 一列,其中 1 的总数为:

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;

如何在同一个 CTE 中添加名为 TotalNo0s 的第二列,我已在其中评论以表明我的意思。

使用条件聚合:

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;

要直接使用 COUNT(),请注意它会计算任何非 NULL 值。您可以省略隐式 returns NULL if not stated

的 ELSE 条件
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

或者,明确声明 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

没有 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