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

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°474657
KaLiS
Seregmegilmor
Posté le 01-08-2003 à 15:45:42  profilanswer
 

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

mood
Publicité
Posté le 01-08-2003 à 15:45:42  profilanswer
 

n°474874
Rosa
Posté le 01-08-2003 à 18:20:04  profilanswer
 

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;
/
 
 

n°474885
Rosa
Posté le 01-08-2003 à 18:28:53  profilanswer
 

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....

n°475233
KaLiS
Seregmegilmor
Posté le 01-08-2003 à 22:52:28  profilanswer
 

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
n°475295
Rosa
Posté le 01-08-2003 à 23:32:56  profilanswer
 

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

n°475753
KaLiS
Seregmegilmor
Posté le 02-08-2003 à 12:36:51  profilanswer
 

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

n°475761
tomlameche
Et pourquoi pas ?
Posté le 02-08-2003 à 12:44:46  profilanswer
 

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é
n°475908
red factio​n
Posté le 02-08-2003 à 18:52:37  profilanswer
 

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
n°476139
ratibus
Posté le 03-08-2003 à 10:09:32  profilanswer
 

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;


 
 :)

n°476760
KaLiS
Seregmegilmor
Posté le 04-08-2003 à 11:12:11  profilanswer
 

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

mood
Publicité
Posté le 04-08-2003 à 11:12:11  profilanswer
 

n°477453
MagicBuzz
Posté le 04-08-2003 à 20:15:31  profilanswer
 

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
n°478549
KaLiS
Seregmegilmor
Posté le 05-08-2003 à 20:09:33  profilanswer
 

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 ;))

n°478602
Rosa
Posté le 05-08-2003 à 22:10:56  profilanswer
 

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
 

n°479325
ratibus
Posté le 06-08-2003 à 21:32:30  profilanswer
 

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

n°479377
Rosa
Posté le 06-08-2003 à 22:50:41  profilanswer
 

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

n°480871
KaLiS
Seregmegilmor
Posté le 08-08-2003 à 12:42:48  profilanswer
 

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

n°480936
MagicBuzz
Posté le 08-08-2003 à 13:20:56  profilanswer
 

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.


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

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

 

Sujets relatifs
ACCESS | Probleme de date HELPPPP[ACCESS]Questions sur la multi utilisation
[SGBD] Cherche équivalent ('%query%') pour Access !!!Requêtes MX sur un DNS
Retrouver un mot de passe Sybase SQL Anywhere[ACCESS] Affecter une valeur à un composant d'un formulaire
SQL question à la con : i++SQL : Requete de barbare inside
access transformer un etat en pdf via vb 
Plus de sujets relatifs à : [ACCESS][SQL] Questions sur des requêtes avec Group by


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