Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[WD12] requête MySQL count et sum

2 réponses
Avatar
JeAn-PhI
bonjour

j'ai 3 tables dossier, facture, client
dossier(0,n) -> (1,1)facture(1,1) <- (0,n)client

je voudrais compter le nb de dossier par client ET le nb de dossier
spécifique par client

[code]
select CL.id_client,CL.cli_rs,
count(distinct D.id_dossier) as Total,sum(case D.code when 'A' then 1
when 'B' then 1 else 0 end) as ResultatAB,
sum(case D.code 'A' then 1 end) as ResultatA,
sum(case D.code when 'B' then 1 end) as ResultatB
from t_dossier D inner join t_facture F on D.id_dossier = F.id_dossier
inner join t_client CL on F.id_client = CL.id_client
where D.valider = 1
and D.date between "20090101" and "20091231"
and D.nature = "XXX"
and CL.id_client = "123"
[/code]

or si j'ai un dossier qui 2 Factures et 1 Avoir il me compte en double
les ResultatA ou ResultatB cela n'exclut pas les factures avec avoir

comment puis je faire ?

merci

--
Cordialement JeAn-PhI

2 réponses

Avatar
Firetox
Bonjour,

de part le mcd il faut une union
car sinon une jointure normale va multipliser les resultats en focntion du
nombre de facture du client
ce qui est normale

il faut une jointure sur dossier facture car (0,n) --> (1,1)
et une autre sur facture et client qui a les memes cardinalités

ensuite sur cette union faire les sum qui donneront le bon resultats

bon dev
@+


"JeAn-PhI" a écrit dans le message de
news:4b66d93d$0$7039$
bonjour

j'ai 3 tables dossier, facture, client
dossier(0,n) -> (1,1)facture(1,1) <- (0,n)client

je voudrais compter le nb de dossier par client ET le nb de dossier
spécifique par client

[code]
select CL.id_client,CL.cli_rs,
count(distinct D.id_dossier) as Total,sum(case D.code when 'A' then 1 when
'B' then 1 else 0 end) as ResultatAB,
sum(case D.code 'A' then 1 end) as ResultatA,
sum(case D.code when 'B' then 1 end) as ResultatB
from t_dossier D inner join t_facture F on D.id_dossier = F.id_dossier
inner join t_client CL on F.id_client = CL.id_client
where D.valider = 1
and D.date between "20090101" and "20091231"
and D.nature = "XXX"
and CL.id_client = "123"
[/code]

or si j'ai un dossier qui 2 Factures et 1 Avoir il me compte en double les
ResultatA ou ResultatB cela n'exclut pas les factures avec avoir

comment puis je faire ?

merci

--
Cordialement JeAn-PhI




Avatar
JeAn-PhI
Le 01/02/2010, Firetox a supposé :
Bonjour,

de part le mcd il faut une union
car sinon une jointure normale va multipliser les resultats en focntion du
nombre de facture du client
ce qui est normale

il faut une jointure sur dossier facture car (0,n) --> (1,1)
et une autre sur facture et client qui a les memes cardinalités

ensuite sur cette union faire les sum qui donneront le bon resultats

bon dev
@+




cette requête me donne le résultat attendu mais est ce qu'elle peut
être encore optimisé ?

select sum(NbA+NbB)as ResultatAB,sum(NbA) as ResultatA,sum(NbB) as
ResultatB,sum(NbT) as NbT
from
(
select count(distinct id_dossier) as NbA,0 as NbB,0 as NbT
from t_dossier D inner join t_facture F on D.id_dossier = F.id_dossier
inner join t_client CL on F.id_client = CL.id_client
where D.valider = 1
and D.date between "20090101" and "20091231"
and D.nature = "XXX"
and CL.id_client = "123"
and D.resultat = 'A'
union
select 0 as NbA,count(distinct id_dossier) as NbB,0 as NbT
from t_dossier D inner join t_facture F on D.id_dossier = F.id_dossier
inner join t_client CL on F.id_client = CL.id_client
where D.valider = 1
and D.date between "20090101" and "20091231"
and D.nature = "XXX"
and CL.id_client = "123"
and D.resultat = 'B'
union
select 0 as NbA,0 as NbB,count(distinct id_dossier) as NbT
from t_dossier D inner join t_facture F on D.id_dossier = F.id_dossier
inner join t_client CL on F.id_client = CL.id_client
where D.valider = 1
and D.date between "20090101" and "20091231"
and D.nature = "XXX"
and CL.id_client = "123"
) as T

--
Cordialement JeAn-PhI