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

Requète Mysql ardue (pour moi )

2 réponses
Avatar
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

2 réponses

Avatar
Firetox
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" a écrit dans le message de
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





Avatar
jacques Trepp
"Firetox" a écrit dans le message de
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