Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1144 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête d'aggregation

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Requête d'aggregation

n°1890913
Jet
bêêêê !
Posté le 03-06-2009 à 14:48:04  profilanswer
 

Salut,
 
J'utilise access pour produire de mini états à partir de requètes.  
Oui je sais access, caca mais je tape dans une bdd exotique via un lien ODBC, si quelqu'un a mieux comme générateur de petites appli
 
Voilà mon problème:
 
Partons sur deux tables
table 1: FACTURE (renseignements généraux de la facture) clef primaire num (numéro de la facture)
table 2: FACTURE_ELEM  (détails des lignes de la facture) clef primaire num + no ( numéro + ligne de la facture)
 
dans la table 1 j'ai un champ "date_emis" et un champ "code_client"
dans la table 2 j'ai un champ "ref", un champ "qté" et un champ "prix"  
 
j'aimerais faire une requête de regroupement par client et par référence qui me somme les quantités et qui me ramène le prix de la facture la plus récente.
 
Je vais essayer d'écrire cela en SQL même si je n'ai pas l'habitude.
 
Commençons par la somme des quantité par client et référence:

Code :
  1. SELECT code_client, ref, SUM(qte)
  2. FROM FACTURE INER JOIN FACTURE_ELEM ON FACTURE.num = FACTURE_ELEM.num
  3. GROUP BY code_client, ref


 
Ok pour un regroupement (aggregation) de base sur une fonction arithmétique de somme
 
Voyons la façon d'afficher la facture la plus récente par client et par référence:

Code :
  1. SELECT code_client, ref, MAX(date_emis)
  2. FROM FACTURE INER JOIN FACTURE_ELEM ON FACTURE.num = FACTURE_ELEM.num
  3. GROUP BY code_client, ref


 
ça fonctionne bien mais je bloque toujours sur le fait d'afficher un autre champ lié en plus de la date.
 
Si par exemple je veux afficher le prix de la reference de la facture la plus récente  
 

Code :
  1. SELECT code_client, ref, MAX(date_emis), prix
  2. FROM FACTURE INER JOIN FACTURE_ELEM ON FACTURE.num = FACTURE_ELEM.num
  3. GROUP BY code_client, ref, prix


 
Si j'écris la requête comme cela , je n'ai plus mon regroupement par client et référence mais aussi par prix.
En fait je voudrais avoir la facture la plus récente par client et par référence avec son prix associé.
 
Je sens que la réponse va être sous-requête.
 
Merci de m'avoir lu
Jet
 

mood
Publicité
Posté le 03-06-2009 à 14:48:04  profilanswer
 

n°1891088
n4su
Cultive son ignorance...
Posté le 03-06-2009 à 20:02:24  profilanswer
 

Je n'ai pas tout compris...
Reprenons;
Ton resultat est il une table ou un seul n-uplet ?
Si Mr dupont a fait 3 cmd, Mr Durant 5, Ton resultat est il de 2 n-uplet (derniere cmd pour chacun des clients) ou seulement LA derniere commande ?

 

Ta question porte bien sur une seul requete ?
Tu cherche qqch du type:

 

Code_client | Date_emis | Prix
------------|-----------|----

 

Message cité 1 fois
Message édité par n4su le 03-06-2009 à 20:11:16
n°1891112
Jet
bêêêê !
Posté le 03-06-2009 à 22:07:15  profilanswer
 

n4su a écrit :

Je n'ai pas tout compris...
Reprenons;
Ton resultat est il une table ou un seul n-uplet ?
Si Mr dupont a fait 3 cmd, Mr Durant 5, Ton resultat est il de 2 n-uplet (derniere cmd pour chacun des clients) ou seulement LA derniere commande ?
 
Ta question porte bien sur une seul requete ?
Tu cherche qqch du type:
 
Code_client | Date_emis | Prix
------------|-----------|----
 


 
 
Salut,
Oui c'est bien 2 n-uplet (derniere cmd pour chacun des clients)  
et oui je désire obtenir quelque chose de ce style.
 
Le problème étant le regroupement (group by) obligé du champ prix quand on le précise dans le select.
Ce qui me donne plus un n-uplet par client mais aussi par prix différent.
 
Jet

n°1891153
n4su
Cultive son ignorance...
Posté le 04-06-2009 à 00:36:35  profilanswer
 

Code :
  1. Select code_client, date_emis, prix, ref
  2. From Facture F join Facture_elem Fe on F.num=Fe.num
  3. Having Max(date_emis)
  4. group by code_client;
 

Essai ca je pense...
Le having est un peut comme le where mais tu peux y utiliser les fonction.
Tu group uniquement par client, puisqu'il n'y a qu'une facture par client.
Pas besoin du max dans le select.
J'espere que c'est bon, tien moi au courant.

Message cité 1 fois
Message édité par n4su le 04-06-2009 à 00:39:12
n°1891154
Jet
bêêêê !
Posté le 04-06-2009 à 00:51:42  profilanswer
 

n4su a écrit :

Code :
  1. Select code_client, date_emis, prix, ref
  2. From Facture F join Facture_elem Fe on F.num=Fe.num
  3. Having Max(date_emis)
  4. group by code_client;


 
Essai ca je pense...  
Le having est un peut comme le where mais tu peux y utiliser les fonction.
Tu group uniquement par client, puisqu'il n'y a qu'une facture par client.
Pas besoin du max dans le select.
J'espere que c'est bon, tien moi au courant.


 
je vais regarder ça mais c'est justement mon problème, avec access on est obligé de répéter les champs du select dans le group by
 
Ce n'est pas pareil dans mysql d'ailleurs ?
 
Jet

n°1891172
n4su
Cultive son ignorance...
Posté le 04-06-2009 à 07:58:35  profilanswer
 

Pour mysql je ne sais pas, mais pour oracle (payant...) ce n'est pas le cas.
Ou sinon le code que j'ai mis + les attributs du select dans le group by.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Requête d'aggregation

 

Sujets relatifs
Requete dans plusieurs tables [resolu]Requéte sur Access
Pb requete Mysqlsyntaxe d'une requete dans une jsp
requete recuperation max[MySQL] Requête
probleme requete Sql sur update clef primaire[java] Soucis de requête SELECT avec une date
requete trop lente[Besoin d'aide]: php dans requête SQL qui ne fonctionne pas
Plus de sujets relatifs à : Requête d'aggregation


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR