带联合的oracle计数查询

p8ekf7hl  于 2023-01-08  发布在  Oracle
关注(0)|答案(4)|浏览(132)

我有一个查询与联合所有功能,每个给我计数(*)从各自的查询和另一个计数查询返回如下。我想要一个外部查询,给出总数。
第1次查询

select count(*) from a
union all
select count(*) from b;

第1次查询的示例结果:
| 计数|
| - ------|
| 十个|
| 四十|
第2次查询

select count(*) from xy;

第二次查询的示例结果:
| 计数|
| - ------|
| 二十个|
我希望输出像这样在2行:
| 表格|计数|
| - ------| - ------|
| xy|二十个|
| 阿布|五十|
类似上面的一些东西。我如何在oracle中实现这一点?请建议最好的方法来做到这一点。
我写了一个选择和联合,但不知道如何进一步进行。

nafvub8i

nafvub8i1#

一个选项是对第一查询返回的计数求和,然后将其与第二查询联合;另外,添加 constants,显示源代码:

select 'ab' what, (select count(*) from a) + (select count(*) from b) cnt from dual
union all
select 'xy', count(*) from xy;
5f0d552i

5f0d552i2#

您可以用途:

SELECT 'ab' AS type,
       COUNT(*) AS total
FROM   ( SELECT 1 FROM a UNION ALL
         SELECT 1 from b );
UNION ALL
SELECT 'xy', COUNT(*)
FROM   xy;
kfgdxczn

kfgdxczn3#

可以对三个联合Select语句的计数求和,并按源的组合对结果进行分组:

WITH 
    a AS
        ( Select LEVEL "A_ID", 'some column a' "COL_A" From Dual Connect By LEVEL <= 30 ),
    b AS 
        ( Select LEVEL "B_ID", 'some column b' "COL_B" From Dual Connect By LEVEL <= 20 ),
    xy AS 
        ( Select LEVEL "XY_ID", 'some column xy' "COL_XY" From Dual Connect By LEVEL <= 20 )

使用上述示例数据,如下所示:

SELECT
    CASE WHEN SOURCE IN('a', 'b') THEN 'ab' ELSE SOURCE END "SOURCE", 
    Sum(CNT) "CNT"
FROM
    (   Select 'a' "SOURCE", Count(*) "CNT" From a Union All
        Select 'b', Count(*) From b Union All
        Select 'xy', Count(*) From xy
    )
GROUP BY 
    CASE WHEN SOURCE IN('a', 'b') THEN 'ab' ELSE SOURCE END
--  
--  R e s u l t :
--  SOURCE        CNT
--  ------ ----------
--  ab             50 
--  xy             20
n9vozmp4

n9vozmp44#

假设您的真实的查询可能要复杂得多,我认为我们不会试图改变它们,也不会以某种方式合并或拆分它们。
您的第一个查询返回两行。您希望得到它们的总和,因此必须聚合结果并使用SUM
下面的查询对两个查询使用CTE(WITH子句中的子查询),然后对获取此总和的查询使用CTE。然后对最后的UNION ALL查询使用这些CTE。

with query1 (cnt) as (select count(*) from a union all select count(*) from b)
   , query2 (cnt) as (select count(*) from xy)
   , sumquery1 (total) as (select sum(cnt) from query1)
select 'ab' as tables, total from sumquery1
union all
select 'xy' as tables, cnt from query2
order by tables desc;

相关问题