[ACCESS][SQL] Questions sur des requêtes avec Group by

Questions sur des requêtes avec Group by [ACCESS][SQL] - SQL/NoSQL - Programmation

Marsh Posté le 01-08-2003 à 15:45:42    

Bonjour
 
voilà, j'aurai besoin d'aide pour me rafraîchir la mémoire...
 
J'ai pour simplifier, deux tables.
 
Missions
--------
ID
FK_Ville
Frais
 
Villes
--------
ID
NomVille
 
Je veux afficher l'ensemble des frais en fonction des villes, je fais donc naturellement
 
SELECT villes.nomville,sum(missions.frais)
FROM villes,missions
WHERE missions.FK_ville=villes.ID
GROUP BY villes.NomVille
 
donc jusque la tout va bien, c'est après que j'ai oublié.
 
Dans le cas ou j'aurais des villes dans 'Villes' mais qui ne sont référencées nulle part dans 'Missions', que faut-il faire déjà pour qu'elles apparaissent quand même dans le résultat?
En gros
 
VilleA 6541
VilleB
VilleC 112
 
Je crois me souvenir que ça implique un symbole '+' au niveau du WHERE, mais je ne m'en souviens plus.
 
Seconde question à ce sujet, est-il possible d'avoir une ligne "Total" qui reprendrait l'ensemble des sums via la requête, ou est-ce que je vais devoir bidouiller ça dans les Etats?
 
çàd
 
VilleA 6541
VilleB
VilleC 112
Tot   6653
 
 
Voilà voilà, donc ça serait cool si quelqu'un pouvait m'aider avec ça, je suis sur que c'est tout con mais je suis incapable de m'en rappeller.
 
merci d'avance

Reply

Marsh Posté le 01-08-2003 à 15:45:42   

Reply

Marsh Posté le 01-08-2003 à 18:20:04    

voila la 1er partie en fait j'ai chercher avec tt des sélect mais pas moyen le problème se posais sur le sum(frais) ...
donc j'ai créer un bloc PL/SQL :
 
SET SERVEROUTPUT ON  
-- à ne pas oublier pour actionner le DBMS_OUTPUT.PUT_LINE
 
 
DECLARE
 CURSOR c1 is SELECT * from Villes;
        CURSOR c2 is select * from missions;
        cpt NUMBER := 0;
 frais NUMBER(10) := 0;
   
 BEGIN  
 DBMS_OUTPUT.PUT_LINE('- Résultats : ');
 DBMS_OUTPUT.PUT_LINE('-');
 
   for int in c1 LOOP  
                cpt := 0;
  frais :=0;
  for int1 in c2 loop
   if ( int.ID = int1.fk_Ville ) then
    frais := int1.frais + frais;
    cpt := cpt +1;
   end if;
                         
  end LOOP;
 
  if (cpt = 0) then  
   DBMS_OUTPUT.PUT_LINE( '*         ' || int.Nomville  );  
                else
   DBMS_OUTPUT.PUT_LINE( '*         ' ||int.NomVille ||  '          Frais : ' || frais );
  end if;  
     end LOOP;          
                     
END;
/
 
 

Reply

Marsh Posté le 01-08-2003 à 18:28:53    

et en ce qui concerne le total tu repard du bloc PL/SQL et tu fait :
 
DECLARE
 CURSOR c1 is SELECT * from Villes;
 CURSOR c2 is select * from missions;
 cpt NUMBER := 0;
 frais NUMBER(10) := 0;
 total NUMBER(10) := 0;  
 BEGIN  
  DBMS_OUTPUT.PUT_LINE('- Résultats : ');
  DBMS_OUTPUT.PUT_LINE('-');
 
 for int in c1 LOOP  
  cpt := 0;
  frais :=0;
  for int1 in c2 loop
   if ( int.ID = int1.fk_Ville ) then
    frais := int1.frais + frais;
    cpt := cpt +1;
   end if;
  end LOOP;
 
  if (cpt = 0) then  
   DBMS_OUTPUT.PUT_LINE( '*         ' || int.Nomville  );  
  else
   DBMS_OUTPUT.PUT_LINE( '*         ' || int.NomVille ||  '          Frais : ' || frais );
   total := total + frais;
  end if;  
 end LOOP;      
   
 
 DBMS_OUTPUT.PUT_LINE('=         Total   :        ' || Total);
   
                     
END;
/
 
 
tu va obtenir les résultats suivant :
Résultats :
 
*         Bastogne  Frais : 1000
*         Liège   Frais : 1200
*         Jemelle
=         Total   :         2200

 
maintenant c'est a toi de voir....

Reply

Marsh Posté le 01-08-2003 à 22:52:28    

Waa!!
 
Merci beaucoup (ben ça remonte a longtemps mes derniers codages en pl....) ça m'a l'air pas mal... mais...
 
...il ne me semble pas qu'Access supporte le PL/SQL... si?
 
Si ce n'est pas le cas, désolé c'est ma faute, j'aurai du repréciser dans le texte en plus du titre du message que c'était du access... :sweat:  
 
Si c'est le cas, ben autant pour moi... http://llc-compagny.serveftp.net/pub/sm/KaLiS/grindrop.gif


Message édité par KaLiS le 01-08-2003 à 22:54:13
Reply

Marsh Posté le 01-08-2003 à 23:32:56    

ca je ne saurais pas te dire si acces supporte le PL/SQL mais je ne pense pas c'est vrai .... désolée

Reply

Marsh Posté le 02-08-2003 à 12:36:51    

Bah pas grave, je trouverai bien quelque chose, grand merci quand même :)

Reply

Marsh Posté le 02-08-2003 à 12:44:46    

KaLiS a écrit :

Bah pas grave, je trouverai bien quelque chose, grand merci quand même :)


Suffit juste de faire une jointure externe en utilisant "outer join" (je crois que c'est ça dans Access )


---------------
Gérez votre collection de BD en ligne ! ---- Electro-jazzy song ---- Dazie Mae - jazzy/bluesy/cabaret et plus si affinité
Reply

Marsh Posté le 02-08-2003 à 18:52:37    

Rosa a écrit :

et en ce qui concerne le total tu repard du bloc PL/SQL et tu fait :
 
DECLARE
 CURSOR c1 is SELECT * from Villes;
 CURSOR c2 is select * from missions;
 cpt NUMBER := 0;
 frais NUMBER(10) := 0;
 total NUMBER(10) := 0;  
 BEGIN  
  DBMS_OUTPUT.PUT_LINE('- Résultats : ');
  DBMS_OUTPUT.PUT_LINE('-');
 
 for int in c1 LOOP  
  cpt := 0;
  frais :=0;
  for int1 in c2 loop
   if ( int.ID = int1.fk_Ville ) then
    frais := int1.frais + frais;
    cpt := cpt +1;
   end if;
  end LOOP;
 
  if (cpt = 0) then  
   DBMS_OUTPUT.PUT_LINE( '*         ' || int.Nomville  );  
  else
   DBMS_OUTPUT.PUT_LINE( '*         ' || int.NomVille ||  '          Frais : ' || frais );
   total := total + frais;  end if;  
 end LOOP;      
   
 
 DBMS_OUTPUT.PUT_LINE('=         Total   :        ' || Total);[/g]    
                     
END;
/
 
 
tu va obtenir les résultats suivant :
Résultats :
 
*         Bastogne  Frais : 1000
*         Liège   Frais : 1200
*         Jemelle
=         Total   :         2200
maintenant c'est a toi de voir....


 
 :hello:


Message édité par red faction le 02-08-2003 à 18:53:12
Reply

Marsh Posté le 03-08-2003 à 10:09:32    

Code :
  1. SELECT v.NomVille, sum(m.Frais) FROM Villes v LEFT JOIN Missions m ON m.FK_Ville=v.ID GROUP BY v.NomVille;


 
 :)

Reply

Marsh Posté le 04-08-2003 à 11:12:11    

Super!!! Merci Ratibus c'est exactement ce dont j'avais besoin!
Merci aussi aux autres :)

Reply

Marsh Posté le 04-08-2003 à 11:12:11   

Reply

Marsh Posté le 04-08-2003 à 20:15:31    

Pourquoi faire simple quand on peut faire compliqué (et optimisé :D)
 
Sinon, une alternative à le syntaxe de ratibus est :
 
select v.NomVille, sum(m.frais)
from villes v, missions m
where m.FK_ville *= v.ID
group by v.NomVille
 
Par contre, chais jamais de quel côté du égal il faut mettre le "*"
 
La syntaxe avec le (+) est la syntaxe Oracle (le * c'est la syntaxe SQL Server, supportée par access) et c'est pas au niveau du égal, mais des champs qu'il faut le mettre.
 
PS: en plus du nom de la ville, je te conseille de mettre le CP dans le group by, parceque des homonymes de villes, y'en a un paquet.


Message édité par MagicBuzz le 04-08-2003 à 20:16:06
Reply

Marsh Posté le 05-08-2003 à 20:09:33    

Aaahh, je n'avais donc rien fumé quand j'avais repensé à cette histoire de (+), vu la différence entre le wildcard % dans oracle et * dans access j'aurais du m'en douter. Merci d'avoir éclairé ma lanterne ^^
 
(pour les villes, bah en fait y'en a pas tant que ça d'utilisées, mais j'ai de toutes manières simplifié mon example ici, il y'a plus de détails rentrés à ce sujet ;))

Reply

Marsh Posté le 05-08-2003 à 22:10:56    

c'est vrai j'y avait plus penser et je me suis casser la tête avec un bloc PL/SQL alors que c'était bcp plus simple comme ca :
 

Code :
  1. SELECT NomVille AS ville, sum(frais) AS frais
  2. FROM villes v, missions m
  3. WHERE m.FK_ville (+) =   v.ID
  4. GROUP BY v.NomVille;
  5. VILLE           FRAIS
  6. ---------- ----------
  7. Bastogne         1000
  8. Jemelle
  9. Liège            1200


 
on met l'opérateur + sur la table ou l'info est manquante
 

Reply

Marsh Posté le 06-08-2003 à 21:32:30    

vos "+" c'est dans la norme SQL ou bien c'est propriétaire ? (par rapport au LEFT JOIN que j'ai proposé)

Reply

Marsh Posté le 06-08-2003 à 22:50:41    

ratibus a écrit :

vos "+" c'est dans la norme SQL ou bien c'est propriétaire ? (par rapport au LEFT JOIN que j'ai proposé)  


 
la jointure externe s'obtient avec l'opérateur + en SQL

Reply

Marsh Posté le 08-08-2003 à 12:42:48    

Et à priori ça serait sur les systèmes fonctionnant avec Oracle seulement (cf le message de MagicBuzz)

Reply

Marsh Posté le 08-08-2003 à 13:20:56    

Avec les plateformes M$, c'est *, et ce n'est pas au niveau du champ, mais du signe d'égalité qu'il faut le mettre.

Reply

Sujets relatifs:

Leave a Replay

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