Questions sur des requêtes avec Group by [ACCESS][SQL] - SQL/NoSQL - Programmation
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;
/
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....
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...
Si c'est le cas, ben autant pour moi...
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
Marsh Posté le 02-08-2003 à 12:36:51
Bah pas grave, je trouverai bien quelque chose, grand merci quand même
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 )
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 : |
Marsh Posté le 03-08-2003 à 10:09:32
Code :
|
Marsh Posté le 04-08-2003 à 11:12:11
Super!!! Merci Ratibus c'est exactement ce dont j'avais besoin!
Merci aussi aux autres
Marsh Posté le 04-08-2003 à 20:15:31
Pourquoi faire simple quand on peut faire compliqué (et optimisé )
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.
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 )
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 :
|
on met l'opérateur + sur la table ou l'info est manquante
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é)
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
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)
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.
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