SQl将多个CTE中的计数获取到一个表中

SQl将多个CTE中的计数获取到一个表中,sql,amazon-redshift,common-table-expression,Sql,Amazon Redshift,Common Table Expression,我有多个CTE,它们都来自同一个表“表1”。它们返回的只是行数。每个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.... ) 我想得到一个输出,从每个C

我有多个CTE,它们都来自同一个表“表1”。它们返回的只是行数。每个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获得所有计数,并将它们放在一个表中,如:

cte1      cte2      cte3
1,564     3,567     2,861

只要所有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中没有任何联接,则可以使用可能提高性能的大小写和表达式同时运行计数

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