Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 26/02/2013, 19h16   #21
Moskitox
Invité régulier
 
Inscription : février 2013
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 6
Points : 6
Points : 6
J'ai énormément de mal pour la requête 7 aussi, après 3 heures de recherche je suis parvenu à ça

Code :
1
2
3
4
5
6
7
8
9
10
11
Requête 7
 
SELECT "Prenom", "Nom", COUNT(*) AS "Nbre de courses non terminées"
 
FROM  (	SELECT p.prenom AS "Prenom", p.nom AS "Nom", 
		FROM pilote AS p JOIN classement AS cl ON (p.idPilote = cl.idPilote)
		AND cl.positionArr IS NULL
	)
 
WHERE COUNT(*) >= 3
AND cl.dateCourse LIKE '%2010'
Mais je ne sais pas, je pense qu'il y a un problème au niveau du test WHERE COUNT(*) >= 3.

Merci de me lire. (Et de m'aider, le cas échéant.)
Moskitox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 20h12   #22
Fred_34
Membre expérimenté
 
Homme Frédéric
Inscription : juin 2011
Messages : 442
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Localisation : France

Informations forums :
Inscription : juin 2011
Messages : 442
Points : 576
Points : 576
Pour la requête 4, ne faut-il pas utiliser MIN plutôt que MAX ?
Sinon, je pense que ta requête fonctionne.

Pour la requête 5, je ne pense pas qu'une somme puisse t’aider...

Pour la requête 7, ne te compliques pas les choses en essayant d'afficher le nom et le prénom.
Commence par l'écrire en utilisant uniquement la table classement. (Il te faudra aussi un GROUP BY)
Fred_34 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 22h05   #23
Moskitox
Invité régulier
 
Inscription : février 2013
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 6
Points : 6
Points : 6
Merci de ta réponse Fred, en effet pour la requête 3 c'est bien un MIN.
Pour la 4 par contre je pense que la mienne marche avec SUM DISTINCT.

requête 4 :

Code :
1
2
3
4
5
SELECT SUM DISTINCT(pays.nomPays)
FROM classement 
JOIN pilote ON(classement.idPilote = pilote.idPilote)
JOIN pays ON (pilote.idPays = pays.idPays)
WHERE classement.positionArr = '1'
Pour la requête 7 j'ai appliqué vos conseils et je suis reparti du début, je pense avoir trouvé une solution :

Code :
1
2
3
4
5
6
SELECT COUNT(classement.idPilote) AS temp, classement.idPilote, pilote.nom, pilote.prenom 
FROM classement JOIN pilote ON classement.idPilote = pilote.idPilote 
WHERE positionArr IS NULL
AND dateCourse LIKE ‘%2010’ 
GROUP BY classement.idPilote 
HAVING temp >2 ;
Merci d'avance
Moskitox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 23h26   #24
CinePhil
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 13 659
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 49
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 13 659
Points : 25 573
Points : 25 573
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Moskitox Voir le message
Pour la requête 3, vous parlez de requête imbriqué, or il me semble l'avoir fait avec seulement 3 natural join plus la restriction du pays 'Suisse' comme ceci

Code :
1
2
3
4
Requête 3
SELECT MAX(classement.positionArr)
FROM classement NATURAL JOIN pilote NATURAL JOIN pays 
WHERE pays.nomPays = 'Suisse'
Reprenons l'énoncé :
Citation:
Requête 3:
Quel est le meilleur résultat au palmarès d'un pilote Suisse?
Est-ce que la position max est le meilleur résultat ?

Une remarque également :
Il vaut mieux écrire les conditions de jointure en clair plutôt que d'utiliser le NATURAL JOIN.

Citation:
De même pour la requête 4, je vois que vous conseillez un Count Distinct, alors qu'au vu de la question cela serais plutôt un SUM DISTINCT étant donnée qu'il nous es demandé combien d'hymnes nationaux différents ont déjà été joués au total
Puis plus tard...
Citation:
Pour la 4 par contre je pense que la mienne marche avec SUM DISTINCT.
Code :
1
2
3
4
5
SELECT SUM DISTINCT(pays.nomPays)
FROM classement 
JOIN pilote ON(classement.idPilote = pilote.idPilote)
JOIN pays ON (pilote.idPays = pays.idPays)
WHERE classement.positionArr = '1'
Si j'additionne France et Espagne, ça donne quoi comme résultat ?
En plus, c'est faux syntaxiquement.

Citation:
Pour la requête 7 j'ai appliqué vos conseils et je suis reparti du début, je pense avoir trouvé une solution :
Code :
1
2
3
4
5
6
SELECT COUNT(classement.idPilote) AS temp, classement.idPilote, pilote.nom, pilote.prenom 
FROM classement JOIN pilote ON classement.idPilote = pilote.idPilote 
WHERE positionArr IS NULL
AND dateCourse LIKE ‘%2010’ 
GROUP BY classement.idPilote 
HAVING temp >2 ;
Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.

Try again !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise la suite Linux Mageïa !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 17h01   #25
Moskitox
Invité régulier
 
Inscription : février 2013
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 6
Points : 6
Points : 6
Effectivement, cela paraissait évident... erreur rectifié! (Il y avais une erreur de syntaxe ?)

Requête 4

Code :
1
2
3
SELECT COUNT DISTINCT (pays.nomPays)
FROM classement JOIN pilote ON(classement.idPilote = pilote.idPilote) JOIN pays ON (pilote.idPays = pays.idPays)
WHERE classement.positionArr = '1'
Je ne suis pas persuadé de la véracité de ma requête 6, j'ai essayé de prendre exemple sur votre requête N°8 en placant une sous req. en JOIN :

Requête 6

Code :
1
2
3
4
5
6
7
SELECT p.nom, p.prenom, cl.positionArr
FROM pilote AS p RIGHT JOIN classement AS cl ON (p.idPilote = cl.idPilote)
RIGHT JOIN ( 
			SELECT MAX(c.dateCourse)
			FROM course
		) AS temp ON (temp.dateCourse = cl.dateCourse)
ORDER BY cl.positionArr ASC
Concernant la requête 7, je pense avoir compris votre message et ainsi rectifié :

Requête 7

Code :
1
2
3
4
5
6
SELECT COUNT(classement.idPilote) AS temp, pilote.nom, pilote.prenom 
FROM classement JOIN pilote ON classement.idPilote = pilote.idPilote 
WHERE positionArr IS NULL
AND dateCourse LIKE ‘%2010’ 
GROUP BY pilote.nom, pilote.prenom
HAVING temp > 3
J'ai une petite question supplémentaire n'ayant rien à voir avec cet exercice.

J'ai une nouvelle table temporaire que j'aimerai implanter dans une table existante de la manière suivante :

INSERT INTO table_1
SELECT *
FROM table_temp

La table temp contient 2 champs/colonnes dont un est identique à un des champs de table_1 donc pas de soucis mais l'autre a un nom différent ... comment faire pour que ce champ aille au bon endroit dans table_1 ?

Merci beaucoup pour votre aide.
Moskitox est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 17h09   #26
aieeeuuuuu
Expert Confirmé
 
Inscription : janvier 2010
Messages : 1 689
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 689
Points : 2 662
Points : 2 662
Bonjour,

Citation:
Envoyé par Moskitox Voir le message
J'ai une nouvelle table temporaire que j'aimerai implanter dans une table existante de la manière suivante :

INSERT INTO table_1
SELECT *
FROM table_temp

La table temp contient 2 champs/colonnes dont un est identique à un des champs de table_1 donc pas de soucis mais l'autre a un nom différent ... comment faire pour que ce champ aille au bon endroit dans table_1 ?

Merci beaucoup pour votre aide.
En spécifiant leur nom, comme il devrait être fait systématiquement :

Code :
1
2
3
4
 
INSERT INTO table_1 (ColonneA, ColonneX)
    SELECT ColonneA, ColonneY
    FROM table_temp
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 27/02/2013, 18h06   #27
Moskitox
Invité régulier
 
Inscription : février 2013
Messages : 6
Détails du profil
Informations forums :
Inscription : février 2013
Messages : 6
Points : 6
Points : 6
Merci, c'est exactement ce que je cherchais.
Moskitox est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 11h38.


 
 
 
 
Partenaires

Hébergement Web