簡體   English   中英

獲取記錄數 - Oracle

[英]Get Count of records - Oracle

我試圖通過加入 2 個或更多表來獲取表中的記錄數。 假設我有如下 3 個表,

Table A
Column 1   Column 2
121        XX
123        XX
124        A0
125        A2
126        XX

Table B
Column 1
A0
A1
A2
A3

Table C
Column 1 Column 2
121        A0
122        A1
123        A0
124        A0
125        A2
126        A3

從這些我需要計算結果如下,

Column 1     Column 2
XX,A0        2
XX,A1        0        
XX,A2        0
XX,A3        1
A0,A0        1
A1,A1        0
A2,A2        1
A3,A3        0

這里我有 121 和 123,表 A 中有 XX,表 C 中有相同的 121,123 和 A0,因此計數應為 2。同樣,124 在表 A 中具有 A0,在表 C 中具有 A0,因此計數應為 1,如果沒有與任何記錄匹配的記錄第 2 列它應該有 0。

我嘗試使用以下查詢,它沒有按預期返回,

select b.column2 ||','|| c.column2 column , count(a.column1) count
          from table A a
          join table c c
           on a.column1=c.column1       
          join table b b
            on b.column1=c.column2
        group by b.column2 ||','|| c.column2
        order by b.column2 ||','|| c.column2

應使用Table A而不是Table B來組合這些值。 表 B 沒有列Colunn2

另外,請記住a.column2 ||','|| c.column2別名 a.column2 ||','|| c.column2不應該是column因為這是 oracle 中的保留關鍵字。 所以你可以使用column2或其他東西。

編輯:以下將為不匹配的記錄提供0計數。

select t1.column2,
case when t2.count1 is not null then t2.count1 else t1.count1 end as count1 
from (
(select distinct a.column2||','||b.column1 as column2,
 0 as count1 from tableA a join tableB b on  a.column2='XX'
union 
select distinct c.column2||','||b.column1 as column2,
 0 as count1 from tableC c join tableB b on c.column2=b.column1
)t1
left join 
(select a.Column2 ||','|| c.Column2 as column2, 
  count(*) count1 from TableA a join TableC c on a.column1=c.column1 
  join TableB B on b.column1=c.column2 group by a.column2 ||','|| c.column2 
)t2
on t1.column2=t2.column2
)
order by 
t1.column2

輸出:

A0,A0   1
A1,A1   0
A2,A2   1
A3,A3   0
XX,A0   2
XX,A1   0
XX,A2   0
XX,A3   1

首先,您需要一個笛卡爾積來獲取 tablea 和 tableb 之間所有可能組合的集合。 我將列名更改為更具可讀性的名稱。

create table tablea(id int, name varchar2(10));

create table tableb(name varchar2(10));

create table tablec(id int, name varchar2(10));

insert into tablea
select 121,'XX' from dual union all
select 123,'XX' from dual union all
select 124,'A0' from dual union all
select 125,'A2' from dual union all
select 126,'XX' from dual 

insert into tableb
select 'A0' from dual union all
select 'A1' from dual union all
select 'A2' from dual union all
select 'A3' from dual 

insert into tablec
select 121,'A0' from dual union all
select 122,'A1' from dual union all
select 123,'A0' from dual union all
select 124,'A0' from dual union all
select 125,'A2' from dual union all 
select 126,'A3' from dual 

--Gets all possible combination of tablea and tableb
select distinct a.name as a_name,b.name as b_name
       from tablea a
       join tableb b
         on 1=1

然后您將按如下方式對這些組合字段進行分組

with data
 as (select distinct a.name as a_name,b.name as b_name
       from tablea a
       join tableb b
         on 1=1
     )  
    ,tablec_data
     as (select c.name c_name,a.name a_name
           from tablec c
           join tablea a
             on c.id=a.id
       )
select max(m.a_name||','||m.b_name) as val_name,count(n.c_name) as cnt
  from data m
left join tablec_data n
    on m.a_name=n.a_name
    and m.b_name=n.c_name
group by m.a_name,m.b_name    
order by m.a_name desc,m.b_name

這是一個數據庫小提琴鏈接

https://dbfiddle.uk/?rdbms=oracle_18&fiddle=9e573822ecc1087e5871c80b586d1116

+----------+-----+
| VAL_NAME | CNT |
+----------+-----+
| XX,A0    |   2 |
| XX,A1    |   0 |
| XX,A2    |   0 |
| XX,A3    |   1 |
| A2,A0    |   0 |
| A2,A1    |   0 |
| A2,A2    |   1 |
| A2,A3    |   0 |
| A0,A0    |   1 |
| A0,A1    |   0 |
| A0,A2    |   0 |
| A0,A3    |   0 |
+----------+-----+

首先准備鍵列,使用簡單的聯合。 然后使用這個keys來構造連接。 Left join是因為我們也需要零:

with keys as (select 'XX' ka, column1 kb from b union all select column1, column1 from b)
select ka, kb, sum(case when c.column2 is not null then 1 else 0 end) cnt
  from keys
  left join a on ka = a.column2
  left join c on kb = c.column2 and a.column1 = c.column1
  group by ka, kb
  order by ka, kb

dbfiddle 演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM