【问题标题】:SQl get counts from multiple CTEs into one tableSQl 从多个 CTE 中获取计数到一个表中
【发布时间】:2021-08-13 17:36:01
【问题描述】:

我有多个 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

【问题讨论】:

    标签: sql amazon-redshift common-table-expression


    【解决方案1】:

    只要您的所有 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
    

    【讨论】:

      【解决方案2】:
      SELECT
        (SELECT COUNT(*) FROM table1 WHERE....) as cte1,
        (SELECT COUNT(*) FROM table1 WHERE....) as cte2,
        (SELECT COUNT(*) FROM table1 WHERE....) as cte3
      

      【讨论】:

        猜你喜欢
        • 2018-06-15
        • 2020-06-04
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2012-08-10
        • 2020-11-24
        • 2020-11-29
        • 1970-01-01
        相关资源
        最近更新 更多