sql - 指定许多联合 COUNT 语句的来源

标签 sql oracle union

我的目标是计算与三个表关联的记录数,并将结果相互合并。但是,UNION 似乎会自动对结果进行排序,因此无法知道哪个结果来自哪个表。

SELECT COUNT(*) FROM ACTM JOIN CUS_CHILD
    ON actm.cust_id = cus_child.cust_id
UNION
SELECT COUNT(*) FROM ACTM JOIN CUS_ADULT
    ON actm.cust_id = cus_adult.cust_id
UNION
SELECT COUNT(*) FROM ACTM JOIN CUS_ELDER
    ON actm.cust_id = cus_elder.cust_id

/* Results in: */
COUNT(*)
    0
    3
    4

我想到了两种可能的解决方案:

  • 添加包含表名称或只是一些字符串的列
  • 以某种不同的形式(可能是矩阵形式)显示结果

它们看起来像这样:

Name  | COUNT(*)    Child | Adult | Elder    Child | Adult | Elder
----------------    ---------------------    ---------------------
Child | 3             3       4       0        3       0       0
Adult | 4                                      0       4       0
Elder | 0                                      0       0       0

我尝试将每个结果 COUNT(*) 重命名为“Child” 等以实现中间结果,但它只生成一个名为 Child 的列。

所以我不知道如何实现这些,我对 SQL 很陌生。任何想法将不胜感激。

最佳答案

不要使用UNION——除非您想承担删除重复项的开销。

SQL 结果集是无序的,除非您有显式的ORDER BY。因此,不要依赖于顺序,并包含一列说明该数字的用途:

SELECT 'child' as which, COUNT(*)
FROM ACTM JOIN
     CUS_CHILD
     ON actm.cust_id = cus_child.cust_id
UNION ALL
SELECT 'adult' as which,  COUNT(*)
FROM ACTM JOIN
     CUS_ADULT
     ON actm.cust_id = cus_adult.cust_id
UNION ALL
SELECT 'elder' as which, COUNT(*)
FROM ACTM JOIN
     CUS_ELDER
     ON actm.cust_id = cus_elder.cust_id;

您还可以进行这些子查询并简单地执行以下操作:

SELECT (SELECT COUNT(*)
        FROM ACTM JOIN
            CUS_CHILD
            ON actm.cust_id = cus_child.cust_id
       ) as num_child,
       (SELECT COUNT(*)
        FROM ACTM JOIN
             CUS_ADULT
             ON actm.cust_id = cus_adult.cust_id
       ) as num_adult,
       (SELECT COUNT(*)
        FROM ACTM JOIN
             CUS_ELDER
             ON actm.cust_id = cus_elder.cust_id
       ) as num_elder
FROM dual;

关于sql - 指定许多联合 COUNT 语句的来源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49717275/

相关文章:

sql - 将两个 SQL 行合并为一个

MYSQL Performance on subquery count of another table

SQL Server 2012审计报告生成

oracle - sql*plus 和 sql loader 的区别

C++ 在 Linux 中访问 Oracle

sql - Oracle:当同一查询中更具体的值为空时,如何获取默认值?

sql - 如何使用 sql 查询有效地计算注册和取消(postgresql 9.0)

sql - JOIN 打破 WHERE 子查询

mysql - 优化 UNION mysql 查询

mysql - Union all 似乎没有按预期工作。返回更少的行