首页 > 解决方案 > SQl 从多个 CTE 中获取计数到一个表中

问题描述

我有多个 CTE,它们都来自同一个表“table1”。他们返回的只是行数。每个 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

标签: sqlamazon-redshiftcommon-table-expression

解决方案


只要您的所有 CTE 仅返回 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

推荐阅读