我的目标是计算与三个表关联的记录数,并将结果相互合并。但是,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/