Requête d'aggregation

Requête d'aggregation - SQL/NoSQL - Programmation

Marsh Posté le 03-06-2009 à 14:48:04    

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
 

Reply

Marsh Posté le 03-06-2009 à 14:48:04   

Reply

Marsh Posté le 03-06-2009 à 20:02:24    

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
Reply

Marsh Posté le 03-06-2009 à 22:07:15    

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

Reply

Marsh Posté le 04-06-2009 à 00:36:35    

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
Reply

Marsh Posté le 04-06-2009 à 00:51:42    

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

Reply

Marsh Posté le 04-06-2009 à 07:58:35    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed