Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes 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 04/01/2011, 21h16   #1
Invité de passage
 
Simon Faucher
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Simon Faucher

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Par défaut Requête pour résultats sur une seule ligne

Bonjour,

Soyez indulgent, je suis débutant en SQL.

J'ai une requête qui me donne les résultats d'une course. J'ai une table qui me donne les infos sur le coureur, une sur ses résultats (départ, arrivée, temps) et une sur les temps de passages (qui peuvent en compter un nombre indéfini).

J'aimerais que la requête me donne les résultats sur une seule ligne.

ex:

nom, départ, arrivée, split 1, split 2, final
Simon, 9h00, 10h00, 9h15, 9h45, 1h00

Ma requête actuel me donne ce résultats mais n'affiche pas ceux qui aurais abandonné la course avant le split 2. Elle se limite aussi à 2 temps de passage.

Code :
1
2
3
4
5
6
7
8
9
10
SELECT     RES.IdDetailResultat, RES.Depart, CP1.DateHeure AS Check1, CP2.DateHeure AS Check2, RES.Arrivee, dbo.View_Resultats.IdResultat, 
                      dbo.View_Resultats.IdParticipant, dbo.View_Resultats.IdEvenement, dbo.View_Resultats.IdEpreuve, dbo.Participants.Nom, dbo.Participants.Prenom, 
                      dbo.Participants.Sexe, dbo.Participants.Groupe, dbo.Participants.Dossard, dbo.Evenements.Nom AS Nom_event, dbo.Epreuves.Nom AS Nom_epreuve
FROM         dbo.DetailResultats AS RES INNER JOIN
                      dbo.View_Resultats ON RES.IdResultat = dbo.View_Resultats.IdResultat INNER JOIN
                      dbo.Participants ON dbo.View_Resultats.IdParticipant = dbo.Participants.IdParticipant INNER JOIN
                      dbo.Evenements ON dbo.Participants.IdEvenement = dbo.Evenements.IdEvenement INNER JOIN
                      dbo.Epreuves ON dbo.View_Resultats.IdEpreuve = dbo.Epreuves.IdEpreuve INNER JOIN
                      dbo.CheckPoints AS CP1 ON RES.IdDetailResultat = CP1.IdDetailResultat INNER JOIN
                      dbo.CheckPoints AS CP2 ON RES.IdDetailResultat = CP2.IdDetailResultat AND CP2.DateHeure > CP1.DateHeure
Merci de votre aide.
jobine2011 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 12h12   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
Commencez par respecter la charte en postant le DDL de vos tables :
http://www.developpez.net/forums/d96...vement-poster/

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 13h51   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour

Pour afficher les résultats pour ceux qui n'ont pas passé tous les checkpoints, faites des jointure externes pour CP1 et CP2 :
Code :
1
2
3
 
LEFT OUTER JOIN Checkpoint CP1 ON...
LEFT OUTER JOIN CheckPoint CP2 ON...
pour la limite a deux passages, combien avez vous de passages au maximum ?
L'utilisation de PIVOT serait peut être plus simple, mais ne résoudra pas le problème du nombre de passage indéfini : vous ne pouvez pas faire une requete qui retourne un nombre variable de colonnes, à moins de générer dynamiquement votre requete et de l'exécuter ensuite, mais c'est très sale comme solution.
Le mieux dans ce cas est de traiter ce problème au niveau de votre programme qui affiche les résultats, et donc une requete qui renvoi une ligne par checkpoint (ordonné par date/heure pour simplifier les choses !)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/01/2011, 17h06   #4
Invité de passage
 
Simon Faucher
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Simon Faucher

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Bonjour,

Merci pour vos réponses.

J'ai modifier la requête. Le résultats ajoute bien les participant qui ne passe pas au point 2 mais me double ceux qui ont fait le parcours complet. Une fois avec toute l'information et une deuxième fois avec le checkpoint 1 seulement avec le temps du 2 et null dans le checkpoint 2...

Voici le résultats:
Code :
1
2
3
4
3458	2011-01-05 10:31:56.1638000	2011-01-05 10:55:56.1630000	NULL	NULL	1892	1898	32	21	Faucher	Martin	H	NULL	2	Devl test CHECK point	Canot sur glace 
3459	2011-01-05 10:31:41.3338000	2011-01-05 10:41:41.3330000	2011-01-05 10:58:41.3330000	NULL	1893	1899	32	21	Faucher	Simon	H	NULL	1	Devl test CHECK point	Canot sur glace 
3459	2011-01-05 10:31:41.3338000	2011-01-05 10:58:41.3330000	NULL	NULL	1893	1899	32	21	Faucher	Simon	H	NULL	1	Devl test CHECK point	Canot sur glace 
3460	2011-01-05 10:36:30.4638000	2011-01-05 10:55:30.4630000	NULL	NULL	1894	1900	32	21	Bouchard	MArie	F	NULL	3	Devl test CHECK point	Canot sur glace
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT DISTINCT 
                      RES.IdDetailResultat, RES.Depart, CP1.DateHeure AS Check1, CP2.DateHeure AS Check2, RES.Arrivee, dbo.View_Resultats.IdResultat, 
                      dbo.View_Resultats.IdParticipant, dbo.View_Resultats.IdEvenement, dbo.View_Resultats.IdEpreuve, dbo.Participants.Nom, dbo.Participants.Prenom, 
                      dbo.Participants.Sexe, dbo.Participants.Groupe, dbo.Participants.Dossard, dbo.Evenements.Nom AS Nom_event, dbo.Epreuves.Nom AS Nom_epreuve
FROM         dbo.DetailResultats AS RES INNER JOIN
                      dbo.View_Resultats ON RES.IdResultat = dbo.View_Resultats.IdResultat INNER JOIN
                      dbo.Participants ON dbo.View_Resultats.IdParticipant = dbo.Participants.IdParticipant INNER JOIN
                      dbo.Evenements ON dbo.Participants.IdEvenement = dbo.Evenements.IdEvenement INNER JOIN
                      dbo.Epreuves ON dbo.View_Resultats.IdEpreuve = dbo.Epreuves.IdEpreuve LEFT OUTER JOIN
                      dbo.CheckPoints AS CP1 ON RES.IdDetailResultat = CP1.IdDetailResultat LEFT OUTER JOIN
                      dbo.CheckPoints AS CP2 ON RES.IdDetailResultat = CP2.IdDetailResultat AND CP2.IdCheckPoint > CP1.IdCheckPoint
Voici mes tables:

table Detailsresultats:
iddetailsresultats
idresultat
idevenement
depart
arrivée
rang
sequence

Table CheckPoint:
idcheckpoint
iddetailresultat
dateheure

Merci de votre aide

jobine2011 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h10.


 
 
 
 
Partenaires

Hébergement Web