cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 2014
-
12 févr. 2006 à 21:04
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 2014
-
18 févr. 2006 à 14:55
Bonjour à vous,
J'ai construit deux requêtes sur le meme groupe de table mais une avec
une clause group by et l'autre sans. Je voudrais maintenant les relier
pour n'en faire qu'une et je ne vois pas comment . Si quelqu'un peut
m'aider...
Les tables coupables: (SAISON, FORMULE, RANGF)
(Désolé on ne peut pas importer d'images, et le code de création est auto généré, alors peut importe les types de données).
La table Formule est reliée à RangF par sa clé IdFormule
La table Saison est reliée à RangF par sa clé IdSaison
create table SAISON (
IDSAISON NUMBER(10,0) not null,
NOMSAISON VARCHAR2(64) not null,
ANNEE NUMBER(38,0) not null,
ACTIVE CHAR(1) not null,
COURANTE CHAR(1) not null, constraint SAISON_PK primary key (IDSAISON) );
create table FORMULE (
IDFORMULE NUMBER(10,0) not null,
NOMFORMULE VARCHAR2(255) not null,
PRIX NUMBER not null, constraint FORMULE_PK primary key (IDFORMULE) );
1) SELECT Formule.IdFormule AS IdProduit, NomFormule AS NomProduit, Prix, Saison.IdSaison, NomSaison, Annee
FROM Formule
LEFT JOIN RangF ON (Formule.IdFormule = RangF.IdFormule OR RangF.IdSaison IS NULL)
LEFT JOIN Saison ON (RangF.IdSaison = Saison.IdSaison OR Saison.IdSaison IS NULL)
ORDER BY Formule.IdFormule DESC, Annee, Saison.IdSaison
Résultat 1:
IdProduit |
NomProduit |
Prix |
IdSaison |
NomSaison |
Annee |
<!-- Results table body -->
----
10,
fghfghdf,
45,
NULL,
NULL,
NULL,
----
9,
cvn,
25,
NULL,
NULL,
NULL,
----
8,
Menu Saint Valentin,
25,
1,
Janvier-Mars,
2006,
----
7,
Formule Express,
7,
1,
Janvier-Mars,
2006,
----
7,
Formule Express,
7,
2,
Avril-Juin,
2006,
----
6,
Formule Complète,
9,
1,
Janvier-Mars,
2006,
----
5,
Menu enfant -12 ans,
8,
1,
Janvier-Mars,
2006,
----
5,
Menu enfant -12 ans,
8,
2,
Avril-Juin,
2006,
----
4,
Menu à,
16.5,
1,
Janvier-Mars,
2006,
----
4,
Menu à,
16.5,
2,
Avril-Juin,
2006,
----
3,
Menu à,
17.5,
1,
Janvier-Mars,
2006,
----
3,
Menu à,
17.5,
2,
Avril-Juin,
2006,
----
2,
Menu à,
21.5,
1,
Janvier-Mars,
2006,
----
2,
Menu à,
21.5,
2,
Avril-Juin,
2006,
----
1,
Menu Tout Compris,
25.5,
1,
Janvier-Mars,
2006,
----
1,
Menu Tout Compris,
25.5,
2,
Avril-Juin,
2006
2) SELECT Formule.IdFormule, COUNT(Saison.IdSaison) AS Total
FROM Formule
LEFT JOIN RangF ON (Formule.IdFormule = RangF.IdFormule OR RangF.IdSaison IS NULL)
LEFT JOIN Saison ON (RangF.IdSaison = Saison.IdSaison OR Saison.IdSaison IS NULL)
GROUP BY Formule.IdFormule
ORDER BY IdFormule DESC
Résultat 2:
IdFormule |
Total |
<!-- Results table body -->
----
10,
0,
----
9,
0,
----
8,
1,
----
7,
2,
----
6,
1,
----
5,
2,
----
4,
2,
----
3,
2,
----
2,
2,
----
1,
2
En fait, la requete 1 me donne la liste de tous les formules même
celles qui ne sont pas reliées à une saison, et pour chaque formule,
j'obtiens une ligne pour chaque saison avec son nom et son année.
Avec la requete 2, j'obtiens le nombre de saisons en relation avec chaque formule.
Maintenant, je voudrais joindre le résultat de ces deux requêtes pour
avoir le résultat de la seconde dans les lignes appropriées du premier
résultat. C'est à dire je voudrais que chaque ligne du Résultat 1
comporte une colonne supplémentaire (Total) du Résultat 2 en les
reliant par l'IdFormule (il y aura une valeur identique, le nombre
total de saison à laquelle elle est associée, pour chaque formule) .
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 18 févr. 2006 à 14:55
Bonjour,
En repartant de l'idée du champ calculé pour chaque ligne, j'ai refait les jointures dans la sous-requête, modifié la syntaxe des alias et enlevé les parenthèses inutiles :
SELECT F1.IdFormule AS IdProduit, NomFormule AS NomProduit, Prix, Saison.IdSaison, NomSaison, Annee, (
SELECT COUNT( Saison.IdSaison )
FROM Formule F2
LEFT JOIN RangF ON F2.IdFormule = RangF.IdFormule
OR RangF.IdSaison IS NULL
LEFT JOIN Saison ON RangF.IdSaison = Saison.IdSaison
OR Saison.IdSaison IS NULL
WHERE F2.IdFormule = F1.IdFormule
) AS Total
FROM Formule F1
LEFT JOIN RangF ON F1.IdFormule = RangF.IdFormule
OR RangF.IdSaison IS NULL
LEFT JOIN Saison ON RangF.IdSaison = Saison.IdSaison
OR Saison.IdSaison IS NULL
ORDER BY F1.IdFormule DESC , Annee, Saison.IdSaison
Et mysql me DONNE LA BONNE REPONSE !!!!
Alors grand merci pour votre aide.
Mindiell
Messages postés558Date d'inscriptionjeudi 25 juillet 2002StatutMembreDernière intervention 5 septembre 20071 13 févr. 2006 à 16:01
Une solution simple conssite à faire le calcul pour chaque ligne :
SELECT Formule.IdFormule AS IdProduit, NomFormule AS NomProduit, Prix, Saison.IdSaison, NomSaison, Annee
, (
SELECT COUNT(IdFormule) FROM Formule AS F2
WHERE F2.IdFormule = F1.IdFormule
GROUP BY Formule.IdFormule
) AS Total
FROM Formule AS F1
LEFT JOIN RangF ON (Formule.IdFormule = RangF.IdFormule OR RangF.IdSaison IS NULL)
LEFT JOIN Saison ON (RangF.IdSaison = Saison.IdSaison OR Saison.IdSaison IS NULL)
ORDER BY Formule.IdFormule DESC, Annee, Saison.IdSaison
cs_AlexN
Messages postés694Date d'inscriptionlundi 5 décembre 2005StatutMembreDernière intervention 8 janvier 201419 15 févr. 2006 à 18:21
Bonjour,
Merci pour votre réponse et désolé pour ce retour un peu tardif. J'étais au moulin (et pas au four...)
Juste un soucis au niveau de la syntaxe, votre réponse provoquant des messages du type "champ inconnu". J'ai essayé de compléter les alias :
<!--StartFragment --> SELECT F1.IdFormule AS IdProduit, NomFormule AS NomProduit, Prix, Saison.IdSaison, NomSaison, Annee, (
SELECT COUNT( IdFormule )
FROM Formule AS F2
WHERE F2.IdFormule = F1.IdFormule
GROUP BY F2.IdFormule
) AS Total
FROM Formule AS F1
LEFT JOIN RangF ON ( F1.IdFormule = RangF.IdFormule
OR RangF.IdSaison IS NULL )
LEFT JOIN Saison ON ( RangF.IdSaison = Saison.IdSaison
OR Saison.IdSaison IS NULL )
ORDER BY F1.IdFormule DESC , Annee, Saison.IdSaison
et j'obtiens :
"la table F1 n'existe pas"
Où me suis-je trompé ?
Merci beaucoup si vous avez une réponse.