SQl 将多个 CTE 的计数合并为一个 table

SQl get counts from multiple CTEs into one table

我有多个 CTE,它们都来自同一个 table,“table1”。他们 return 只是行数。每个 CTE 之间的差异是 where 语句的内容,因为我想在进行这些小更改时比较计数。代码如下:

WITH cte1 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte2 AS(
SELECT COUNT(*)
FROM table1
WHERE....
), cte3 AS(
SELECT COUNT(*)
FROM table 1
WHERE....
)

我想获得一个输出,其中我从每个 CTE 获得所有计数并将它们集中在一个 table 中,例如:

cte1      cte2      cte3
1,564     3,567     2,861
SELECT
  (SELECT COUNT(*) FROM table1 WHERE....) as cte1,
  (SELECT COUNT(*) FROM table1 WHERE....) as cte2,
  (SELECT COUNT(*) FROM table1 WHERE....) as cte3

只要你所有的 CTE return 只有 1 行,你就可以对所有的 CTE 进行笛卡尔积(所有都在没有连接的 from 子句中)。我相信您需要为您的 count(*) 表达式提供一个列别名,以便将它们也包含在您的 CTE 中。

WITH cte1 AS(
 SELECT COUNT(*) cnt 
 FROM table1
 WHERE....
), cte2 AS(
 SELECT COUNT(*) cnt
 FROM table1
 WHERE....
), cte3 AS(
 SELECT COUNT(*) cnt
 FROM table 1
 WHERE....
)
SELECT cte1.cnt AS cte1, cte2.cnt AS cte2, cte3.cnt AS cte3
FROM cte1, cte2, cte3

此外,如果您的 CTE 中没有任何联接,您可以 运行 通过使用 sum case 表达式同时进行计数,这可能会提高性能。

SELECT SUM(CASE WHEN /* where clause 1 */ THEN 1 ELSE 0 END) cte1,
       SUM(CASE WHEN /* where clause 2 */ THEN 1 ELSE 0 END) cte2,  
       SUM(CASE WHEN /* where clause 3 */ THEN 1 ELSE 0 END) cte3
FROM table1