Requète Mysql ardue (pour moi )

Le
jacques Trepp
Bonjour,
je dois faire une stat sur une base existante. En gros, on veut obtenir le
CA HT par vendeur et par famille de produits, à partir des factures, pour
une période donnée.
Jusque là, c'est facile et j'obtiens ce que je veux.
Sauf que dans la base, il y a une table pour les factures, et une table pour
les avoirs (!!), avec bien sur, les tables lignes détail pour chacune.

Sachant que la requète sur les tables factures et lignes de factures donne
ça :

select client.refcli, client.nom, famart.codfa,
famart.libelle, round(sum(ligfctc.qte*ligfctc.pxvtht),2) as 'CA HT' from
client

inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli

inner join famart on ligfctc.codfa = famart.codfa
where fctcli.datfct between '20090801' and '20090831'

and client.refcli = '000103'
group by codfa, client.refcli;

Comment ajouter une colonne RETOUR HT ?
Mes essais dans ce sens ne fonctionnent pas, car, si je fais un join des
avoirs et lignes avoir :

la requète suivante mélange tout.

select client.refcli, client.nom, famart.codfa,
famart.libelle, round(sum(ligfctc.qte*ligfctc.pxvtht),2) as 'CA HT' from
client

inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli

inner join avcli on avcli.refcli = client.refcli
inner join ligavc on ligavc.id_avcli = avcli.id_avcli


inner join famart on ligfctc.codfa = famart.codfa
where fctcli.datfct between '20090801' and '20090831'
or avcli.datfct between '20090801' and '20090831'

and client.refcli = '000103'

group by codfa, client.refcli;

y a-t-il un moyen, ou dois-je passer par une vue ?

Merci

--
Jacques TREPP
Albypam
3, rue Jean Mermoz
81160 - ST Juery


__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 4436 (20090918) __________

Le message a été vérifié par ESET NOD32 Antivirus.

http://www.eset.com
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 #20174661
Bonjour jacques

une union sur les 2 requetes avec un select global pour faire les sum et
avoir une seule ligne par client
par contre dans chaque requete de l'union il faut ajouter la colonne de
l'autre requete et tu fait un select sur le resultat

TMPTable.refcli, TMPTable.nom, TMPTable.codfa,
TMPTable.libelle,
round(sum(TMPtable.CA),2) as 'CA HT'
round(sum(TMPTable.RETOUR),2) as 'RETOUR HT'

FROM (

select client.refcli, client.nom, famart.codfa,
famart.libelle, ligfctc.qte*ligfctc.pxvtht as 'CA, 0 as 'RETOUR'
from client
inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli
inner join famart on ligfctc.codfa = famart.codfa

where fctcli.datfct between '20090801' and '20090831'
and client.refcli = '000103'

UNION

select client.refcli, client.nom, famart.codfa,
famart.libelle, 0 as 'CA' , ligavc.qte*ligavc.pxvtht as 'RETOUR'
from client
inner join avcli on avcli .refcli = client.refcli
inner join ligavc on ligavc.id_avcli = avcli.id_avcli

where avcli.datfct between '20090801' and '20090831'
and client.refcli = '000103') AS TMPTable

GROUP By codfa, client.refcli;



"jacques Trepp" news:4ab38903$0$410$
Bonjour,
je dois faire une stat sur une base existante. En gros, on veut obtenir le
CA HT par vendeur et par famille de produits, à partir des factures, pour
une période donnée.
Jusque là, c'est facile et j'obtiens ce que je veux.
Sauf que dans la base, il y a une table pour les factures, et une table
pour les avoirs (!!), avec bien sur, les tables lignes détail pour
chacune.

Sachant que la requète sur les tables factures et lignes de factures donne
ça :

select client.refcli, client.nom, famart.codfa,
famart.libelle, round(sum(ligfctc.qte*ligfctc.pxvtht),2) as 'CA HT' from
client

inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli

inner join famart on ligfctc.codfa = famart.codfa
where fctcli.datfct between '20090801' and '20090831'

and client.refcli = '000103'
group by codfa, client.refcli;

Comment ajouter une colonne RETOUR HT ?
Mes essais dans ce sens ne fonctionnent pas, car, si je fais un join des
avoirs et lignes avoir :

la requète suivante mélange tout.

select client.refcli, client.nom, famart.codfa,
famart.libelle, round(sum(ligfctc.qte*ligfctc.pxvtht),2) as 'CA HT' from
client

inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli

inner join avcli on avcli.refcli = client.refcli
inner join ligavc on ligavc.id_avcli = avcli.id_avcli


inner join famart on ligfctc.codfa = famart.codfa
where fctcli.datfct between '20090801' and '20090831'
or avcli.datfct between '20090801' and '20090831'

and client.refcli = '000103'

group by codfa, client.refcli;

y a-t-il un moyen, ou dois-je passer par une vue ?

Merci

--
Jacques TREPP
Albypam
3, rue Jean Mermoz
81160 - ST Juery

__________ Information provenant d'ESET NOD32 Antivirus, version de la
base des signatures de virus 4436 (20090918) __________

Le message a été vérifié par ESET NOD32 Antivirus.

http://www.eset.com





jacques Trepp
Le #20174861
"Firetox" news:4ab3938a$0$1547$
Bonjour jacques

une union sur les 2 requetes avec un select global pour faire les sum et
avoir une seule ligne par client
par contre dans chaque requete de l'union il faut ajouter la colonne de
l'autre requete et tu fait un select sur le resultat

TMPTable.refcli, TMPTable.nom, TMPTable.codfa,
TMPTable.libelle,
round(sum(TMPtable.CA),2) as 'CA HT'
round(sum(TMPTable.RETOUR),2) as 'RETOUR HT'

FROM (

select client.refcli, client.nom, famart.codfa,
famart.libelle, ligfctc.qte*ligfctc.pxvtht as 'CA, 0 as 'RETOUR'
from client
inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli
inner join famart on ligfctc.codfa = famart.codfa

where fctcli.datfct between '20090801' and '20090831'
and client.refcli = '000103'

UNION

select client.refcli, client.nom, famart.codfa,
famart.libelle, 0 as 'CA' , ligavc.qte*ligavc.pxvtht as 'RETOUR'
from client
inner join avcli on avcli .refcli = client.refcli
inner join ligavc on ligavc.id_avcli = avcli.id_avcli

where avcli.datfct between '20090801' and '20090831'
and client.refcli = '000103') AS TMPTable

GROUP By codfa, client.refcli;




Bonjour et merci, Fred :)
En farfouillant dans cette base, j'ai trouvé dans la table lignes-facture
une colonne quantité_retour que j'ai pu utiliser pour extraire les
renseignements demandés.

Du coup, la requète :
select client.refcli, client.nom, famart.codfa,
famart.libelle,
round(sum(ligfctc.qte*ligfctc.pxvtht),2) as 'CA HT',
round(sum(ligfctc.qteret*ligfctc.pxvtht),2) as 'RT HT',
round(sum(ligfctc.qte*ligfctc.pxvtht),2)-round(sum(ligfctc.qteret*ligfctc.pxvtht),2)
as 'CA'
from client

inner join fctcli on fctcli.refcli = client.refcli
inner join ligfctc on ligfctc.id_fctcli = fctcli.id_fctcli


inner join famart on ligfctc.codfa = famart.codfa
where fctcli.datfct between '20090801' and '20090831'

and client.refcli in ('000103','000104')

group by codfa, client.refcli
order by client.refcli, codfa, datfct;

fonctionne parfaitement.

PS : je pensais pouvoir utiliser les alias de colonnes comme des colonnes,
mais j'en demande trop, sans doute :
'CA HT' - 'RT HT' ne fonctionne pas. ;)

Bon Week-end


--
Jacques TREPP
Albypam
3, rue Jean Mermoz
81160 - ST Juery


__________ Information provenant d'ESET NOD32 Antivirus, version de la base des signatures de virus 4437 (20090918) __________

Le message a été vérifié par ESET NOD32 Antivirus.

http://www.eset.com
Publicité
Poster une réponse
Anonyme