Deux requêtes qui ne feraient plus qu'une ? [Résolu]

Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Dernière intervention
8 janvier 2014
- - Dernière réponse : cs_AlexN
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Derniè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) );



create table RANGF (

IDFORMULE NUMBER(38,0) not null,

IDSAISON NUMBER(38,0) not null,

NUMRANG NUMBER(38,0) null, constraint RANGF_PK primary key (IDFORMULE, IDSAISON) );



alter table RANGF

add constraint SAISON_RANGF_FK1 foreign key (

IDSAISON)

references SAISON (

IDSAISON) ON DELETE CASCADE;



alter table RANGF

add constraint FORMULE_RANGF_FK1 foreign key (

IDFORMULE)

references FORMULE (

IDFORMULE) ON DELETE CASCADE;



Les deux requetes :



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



Comment je fais

Merci
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Dernière intervention
8 janvier 2014
3
Merci
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.

Merci cs_AlexN 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 104 internautes ce mois-ci

Commenter la réponse de cs_AlexN
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Dernière intervention
5 septembre 2007
0
Merci
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

Mindiell Software
Commenter la réponse de Mindiell
Messages postés
719
Date d'inscription
lundi 5 décembre 2005
Dernière intervention
8 janvier 2014
0
Merci
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.
Commenter la réponse de cs_AlexN
Messages postés
559
Date d'inscription
jeudi 25 juillet 2002
Dernière intervention
5 septembre 2007
0
Merci
Dans les ON, je laisserais Formule...

je ne mettrais pas de parenthèse autour des ON...

Tu es en SQLServer ?
Commenter la réponse de Mindiell

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.