Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/07/2011, 20h29   #1
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Par défaut Créer une vue à partir d'autres requêtes

Bonjour à tous

Je ramène ici mon plus gros problème à un problème plus basique. L'idée est d'extraire d'une table représentant des notes pour des concours le 1er, 2nd, etc de chaque concours.

Soit une table "concours", comprenant les champs "votant_id", "participant_id", "concours_id" et "note", représentant respectivement les identifiants des votants, l'identifiant du participant au concours, l'identifiant du concours auquel le participant participe, et la note donnée par le votant.

Il est ainsi possible et facile d'obtenir le nombre total de points pour chaque utilisateur :
Code :
1
2
3
SELECT participant_id, concours_id, SUM(note) AS total
FROM concours
GROUP BY participant_id, concours_id
Cependant, j'aimerais obtenir une vue me permettant d'avoir les champs concours_id, participant_id, place, représentant la place de chaque participant pour chaque concours.

Avez-vous une idée de la manière de faire ?

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/07/2011, 23h55   #2
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 445
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 445
Points : 7 532
Points : 7 532
Avec quel SGBD ? quelle version ?
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 08h56   #3
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Bonjour

J'utilise MySQL 5.5.8.

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 09h26   #4
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Meme genre de probleme que dans ce post

Une autojointure et un count devrait vous permettre de vous en sortir.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/07/2011, 11h24   #5
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Citation:
Envoyé par Yanika_bzh Voir le message
Meme genre de probleme que dans ce post

Une autojointure et un count devrait vous permettre de vous en sortir.

Bon courage
Bonjour et merci pour ton lien, je n'avais pas pensé à l'autojointure. J'avais cru comprendre le principe avec l'exemple, mais j'ai du mal à l'appliquer à mon cas.

J'oublie la notion de "concours_id" pour le moment.

Si j'ai bien compris le principe, je dois faire une autojointure avec la table
Code :
1
2
3
4
 
SELECT participant_id, SUM(note)
FROM concours
GROUP BY participant_id
... c'est à dire cette requête :
Code :
1
2
3
4
5
 
SELECT A.participant_id, SUM(A.note)
FROM concours A
INNER JOIN concours B ON (A.participant_id=B.participant_id AND SUM(A.note)<=SUM(B.note))
GROUP BY A.participant_id
Le problème est que j'ai l'impression que les conditions du ON du JOIN n'acceptent pas d'agrégateurs...
J'ai en effet l'erreur suivante :
Citation:
#1111 - Invalid use of group function
Pierre


Edit :

J'ai réussi grâce à une fourberie. Je fais un
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
SELECT *, COUNT(1)
FROM
(
  SELECT ...,SUM(note)
  ...
) A
INNER JOIN
(
  SELECT ...,SUM(note)
  ...
) B
...
En respectant les instructions du lien que tu m'as donné.

Merci encore !

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h51   #6
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Vous n'avez pas fait de fourberie, vous avez simplement trouvé la solution. Il fallait effectivement passer par une sous requete dans votre cas.

Bon courage
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 11h53   #7
Membre Expert
 
Avatar de Yanika_bzh
 
Homme Yannick
Ingénieur Etudes & Developpements
Inscription : février 2006
Messages : 1 125
Détails du profil
Informations personnelles :
Nom : Homme Yannick
Localisation : France, Deux Sèvres (Poitou Charente)

Informations professionnelles :
Activité : Ingénieur Etudes & Developpements
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : février 2006
Messages : 1 125
Points : 1 670
Points : 1 670
Si cela répond a votre probleme, n'oubliez pas le bouton "résolu"
__________________
Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)
Yanika_bzh est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h40   #8
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Rebonjour

J'ai "dérésolu" ce sujet, car je viens de m'apercevoir d'une petite erreur.
En effet, l'autojointure consiste à dire "combien existe-t-il de candidats qui ont une note supérieure ou égale à la mienne ?".
Or, si la table contient les notes (20,10,10,5), on aura les places associées (1,3,3,4). Et ceci car 20, 10 et 10 sont supérieurs ou égaux à 10. Je préfèrerai avoir (1,2,2,4).
J'ai tenté de supprimer le "ou égal" du >=, cependant je perds le 1er, car personne n'est au dessus du 1er.

Avez-vous une esquisse de solution ?

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/07/2011, 13h56   #9
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut,

- Enlève le =, c'est bien
- Ouvre la jointure (LEFT OUTER JOIN)
- Remplace count(*) par count(*) + 1


[EDIT]
Ah, il faut peut être faire COALESCE(count(*), 0) + 1 cela dit
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/07/2011, 14h27   #10
Membre du Club
 
Avatar de ForgetTheNorm
 
Homme
Docteur en informatique
Inscription : novembre 2006
Messages : 124
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France

Informations professionnelles :
Activité : Docteur en informatique
Secteur : Enseignement

Informations forums :
Inscription : novembre 2006
Messages : 124
Points : 43
Points : 43
Citation:
Envoyé par pacmann Voir le message
Salut,

- Enlève le =, c'est bien
- Ouvre la jointure (LEFT OUTER JOIN)
- Remplace count(*) par count(*) + 1


[EDIT]
Ah, il faut peut être faire COALESCE(count(*), 0) + 1 cela dit
C'est parfait !
Merci beaucoup !
Il fallait mettre un COUNT(z), où z est une colonne pouvant prendre NULL en cas de défaut lors de la jointure LEFT OUTER.

Pierre
ForgetTheNorm est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h29.


 
 
 
 
Partenaires

Hébergement Web