Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Dapatkan jumlah catatan UNIK KESELURUHAN per nilai

Saya membuat tabel untuk pengujian:

create table nr_pvo_120 (
   otherid,
   fax
)
as
select 12365092    , 2762364204 from dual union all
select 12005656    , 2762364204 from dual union all
select 12484936    , 2762364204 from dual union all
select 39003042    , 2762364204 from dual union all
select 12365597    , 2762364204 from dual union all
select 12635922    , 2762364204 from dual union all
select 12332346    , 2762364204 from dual union all
select 12365092    , 4387267572 from dual union all
select 12005656    , 4387267572 from dual union all
select 12365092    , 4422911281 from dual union all
select 12005656    , 4422911281 from dual union all
select 12484936    , 4422911281 from dual union all
select 12651239    , 4422911281 from dual union all
select 12388710    , 4422911281 from dual union all
select 12686953    , 4422911281 from dual union all
select 12365092    , 4423311213 from dual union all
select 12005656    , 4423311213 from dual union all
select 12709544    , 4423311213 from dual union all
select 12484936    , 4423311213 from dual union all
select 12005656    , 4424450542 from dual union all
select 12346839    , 4424450542 from dual union all
select 12365120    , 4424450542 from dual union all
select 12484936    , 4424450542 from dual union all
select 12086512    , 4424450542 from dual
/

Tembakan pertama saya adalah:Untuk setiap orang (otherid) dapatkan pertama his nomor faks saja dan kemudian lakukan grup normal dengan dan andalkan itu:

select first_fax, count(*) firstcount
  from (
   select otherid, min(fax) first_fax
     from nr_pvo_120
    group by otherid
       )
 group by first_fax
 order by first_fax
/

Outputnya akan menjadi:

 FIRST_FAX FIRSTCOUNT
---------- ----------
2762364204          7
4422911281          3
4423311213          1
4424450542          3

Kemudian saya melihat output yang Anda inginkan termasuk nomor faks kelima tetapi dengan hitungan nol. Itu misalnya bisa dilakukan seperti ini:

select fax, count(*) normalcount, count(otherid_on_first_fax) countunused
  from (
   select fax, otherid,
          case
             when fax = min(fax) over (partition by otherid order by fax)
             then otherid
          end otherid_on_first_fax
     from nr_pvo_120
       )
 group by fax
 order by fax
/

Dalam output ini, kolom NORMALCOUNT adalah jumlah orang yang memiliki faks itu. Kolom COUNTUNUSED adalah jumlah orang yang belum "digunakan" dalam hitungan sebelumnya:

       FAX NORMALCOUNT COUNTUNUSED
---------- ----------- -----------
2762364204           7           7
4387267572           2           0
4422911281           6           3
4423311213           4           1
4424450542           5           3

Triknya adalah otherid_on_first_fax hanya memiliki nilai otherid pada nomor faks pertama orang tersebut, untuk nomor faks lainnya otherid_on_first_fax adalah NULL. count(otherid_on_first_fax) kemudian menghitung semua nilai bukan nol, yang tidak ada untuk faks 4387267572.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 2 Cara Mengonversi ke Huruf Besar di Oracle

  2. Impor file CSV ke dalam Tabel Eksternal Oracle

  3. Masalah dengan TransactionScope dan Oracle

  4. Bagaimana cara menjalankan grup kueri SQL berdasarkan masalah?

  5. bagaimana cara memilih nilai yang paling sering muncul?