【问题标题】:SQL Query to sum multiple count union queries汇总多个计数联合查询的 SQL 查询
【发布时间】:2019-12-04 09:55:50
【问题描述】:

我有一个具有以下结构的语句,我正在尝试对所有计数结果求和。

我尝试在嵌套计数查询之外使用 SUM 函数,并为每个联合使用相同的变量声明组合,但错误提示我必须给它们单独的别名。但是,如果我这样做,我不需要在 SUM 函数中单独引用这些吗?

我的 SQL 代码返回 2 行:

SELECT COUNT(col_x) FROM tablea
UNION
SELECT COUNT(col_y) FROM tableb;

输出

64
10

现在,当我尝试对答案求和时,我遇到了麻烦:

WITH total as(
SELECT COUNT(col_x) FROM tablea as rowtotal
UNION
SELECT COUNT(col_y) FROM tableb as rowtotal
) SELECT SUM(rowtotal) from total;

错误在于两次使用变量“rowtotal”。肯定有更简单的方法吗?

我只是想要两个值的总和:

OUTPUT
74

【问题讨论】:

  • 您可以只添加 2 个 select 语句的结果而不是 union,从而防止执行计划中的 Merge Join 性能下降:select (SELECT COUNT(col_x) as rowtotal FROM tablea) + (SELECT COUNT(col_y) FROM tableb) 作为答案
  • 非常感谢 DaFi 提供的这个替代方案。两种解决方案产生相同的结果。我出于兴趣对这两个执行时间进行了计时(使用 + 方法而不是 UNION 方法)以从 50 个单独的列中提取总数,并且使用 + 方法完成运行所需的时间是原来的两倍(42 秒与 84 秒)——两者都没有非常适合在搜索查询后推送到网页!
  • 您好,十个字母,感谢您的更新。如果速度如此重要,而且听起来确实如此,那么您可能需要检查查询执行计划以了解如何使其更快。可能缺少一个(或多个)索引

标签: sql count sum union


【解决方案1】:

你可以使用+:

SELECT ( (SELECT COUNT(col_x) FROM tablea) + 
         (SELECT COUNT(col_y) FROM tableb)
       )

或者交叉连接:

SELECT a_cnt + b_cnt
FROM (SELECT COUNT(col_x) as a_cnt FROM tablea) a CROSS JOIN
     (SELECT COUNT(col_y) as b_cnt FROM tableb) b;

不要使用UNION!它会删除重复项,因此您的总和可能会被取消。您可以使用UNION ALL,但您还有其他选择。

【讨论】:

  • Cheers Gordon - 我将尝试交叉连接解决方​​案,看看是否可以缩短处理时间。谢谢!
  • @TenLetters 。 . .只要您可以测量,所有这些都将具有相同的处理时间。
【解决方案2】:

您不需要在表上提供别名,实际上是说为列名提供别名。

WITH total as(
SELECT COUNT(col_x) as total FROM tablea    --- it is necessary over here
UNION
SELECT COUNT(col_y) as total  FROM tableb     --- it is not mandatory to give alias on second statement of UNION
) SELECT SUM(rowtotal) as total from total;

【讨论】:

    【解决方案3】:

    你不需要窗口函数

    select sum(cnt) as total
    from
    (
      SELECT COUNT(col_x) as cnt FROM tablea
      UNION
      SELECT COUNT(col_y) FROM tableb
    ) tmp
    

    【讨论】:

      【解决方案4】:

      试试这个

      WITH total as(
      SELECT COUNT(col_x) as rowtotal FROM tablea 
      UNION
      SELECT COUNT(col_y) FROM tableb 
      ) SELECT SUM(rowtotal) from total
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 2010-09-26
        • 2023-01-14
        • 1970-01-01
        • 2017-04-05
        • 2013-12-20
        • 1970-01-01
        相关资源
        最近更新 更多