[WD12] requête MySQL count et sum

Le
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
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Firetox
Le #21105241
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" 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




JeAn-PhI
Le #21105801
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
Publicité
Poster une réponse
Anonyme