J'ai fait le tableau pour tester :
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
/
Mon premier coup serait :Pour chaque personne (otherid) obtenez son premier numéro de fax uniquement, puis effectuez un regroupement normal et comptez dessus :
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
/
La sortie deviendra :
FIRST_FAX FIRSTCOUNT
---------- ----------
2762364204 7
4422911281 3
4423311213 1
4424450542 3
Ensuite, j'ai remarqué que la sortie souhaitée incluait le cinquième numéro de fax, mais avec un compte de zéro. Cela peut par exemple être fait comme ceci :
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
/
Dans cette sortie, la colonne NORMALCOUNT
est le nombre de personnes ayant ce fax. Colonne COUNTUNUSED
est le nombre de personnes qui n'ont pas encore été "utilisées" dans les décomptes précédents :
FAX NORMALCOUNT COUNTUNUSED
---------- ----------- -----------
2762364204 7 7
4387267572 2 0
4422911281 6 3
4423311213 4 1
4424450542 5 3
L'astuce est que otherid_on_first_fax
n'a que la valeur de otherid
sur le premier numéro de fax de la personne, pour le reste des numéros de fax de la personne otherid_on_first_fax
est NUL. count(otherid_on_first_fax)
compte ensuite toutes les valeurs non nulles, dont il n'y en a pas pour le fax 4387267572.