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 07/01/2011, 16h26   #1
Invité de passage
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 0
Points : 0
Par défaut SQL Server 2008 : Problème requête

Ma table (toto) ressemble à ceci:

FID - Heure - TID
1 - 12:00 - 1
1 - 12:30 - 2
1 - 13:00 - 3
2 - 16:00 - 1
2 - 17:00 - 2
2 - 17:30 - 3
2 - 18:00 - 3
2 - 19:00 - 3
3 - 11:00 - 1
3 - 11:30 - 2
3 - 12:00 - 3
3 - 13:00 - 3

J'aimerais avoir comme retour
FID - Heure TID = 1 - Heure(MIN) TID = 2 - Heure TID(MAX) = 3

Donc

1 - 12:00 - 12:30 - 13:00
2 - 16:00 - 17:00 - 19:00
3 - 11:00 - 11:30 - 13:00

Je suis imcapable de faire cette requête. Je tourne en rond depuis des jours maintenant. Je suis capable de le faire en faisant abtraction du Heure TID = 1 mais quand j'essaie d'inclure dans mes résultats cette colonne, je n'arrive pas à le faire.

En résumé : ça implique dans le fond d'avoir sur une même ligne:

Min Heure - Deuxième Min Heure - Max Heure pour chaque FID de ma table.


Merci d'avance pour l'aide ou du moins sur des pointeurs sur comment résoudre ceci.
kh424 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 16h38   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
C'est un PIVOT :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
declare @Toto TABLE (FID tinyint, Heure char(5), TID tinyint)
 
INSERT INTO @Toto (FID, Heure, TID)
SELECT 1, '12:00', 1 union ALL
SELECT 1, '12:30', 2 union ALL
SELECT 1, '13:00', 3 union ALL
SELECT 2, '16:00', 1 union ALL
SELECT 2, '17:00', 2 union ALL
SELECT 2, '17:30', 3 union ALL
SELECT 2, '18:00', 3 union ALL
SELECT 2, '19:00', 3 union ALL
SELECT 3, '11:00', 1 union ALL
SELECT 3, '11:30', 2 union ALL
SELECT 3, '12:00', 3 union ALL
SELECT 3, '13:00', 3
 
  SELECT FID,
         max(case TID when 1 then Heure end) AS Heure_1,
         min(case TID when 2 then Heure end) AS Heure_2,
         max(case TID when 3 then Heure end) AS Heure_3
    FROM @Toto
GROUP BY FID
 
FID  Heure_1 Heure_2 Heure_3
---- ------- ------- -------
1    12:00   12:30   13:00
2    16:00   17:00   19:00
3    11:00   11:30   13:00
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 16h48   #3
Invité de passage
 
Inscription : janvier 2011
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 8
Points : 0
Points : 0
Wow merci de la réponse rapide.
Je viens d'essayer le tout et ça fonctionne à merveille.

Je dois avouer par contre que je suis bafoué sur la simplicité de la chose je m'attendais à quelque chose de plus imposant que ceci. Je ne suis pas familier avec le principle de PIVOT.

L'intérieur des parentèses des fonctions min et max me trouble. Je ne croyais pas qu'on pouvait placer de telles instruction dans les fonctions MIN/MAX.

Puis-je avoir soit:
- Des explications du pourquoi/comment?
- Un lien sur ce concept?

J'aime que ça fonctionne mais j'aime également assimiler.
Ça me semble très pratique comme concept.
kh424 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 17h32   #4
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 463
Points : 10 463
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Il suffit de décomposer, sans le group by :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
  SELECT FID,
         case TID when 1 then Heure end AS Heure_1,
         case TID when 2 then Heure end AS Heure_2,
         case TID when 3 then Heure end AS Heure_3
    FROM @Toto
 
FID  Heure_1 Heure_2 Heure_3
---- ------- ------- -------
1    12:00   NULL    NULL
1    NULL    12:30   NULL
1    NULL    NULL    13:00
2    16:00   NULL    NULL
2    NULL    17:00   NULL
2    NULL    NULL    17:30
2    NULL    NULL    18:00
2    NULL    NULL    19:00
3    11:00   NULL    NULL
3    NULL    11:30   NULL
3    NULL    NULL    12:00
3    NULL    NULL    13:00
Et l'agrégat derrière pour ne ramener que ce qui nous intéresse.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 19h58   #5
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 769
Points : 17 769
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CREATE TABLE toto (FID INT, Heure TIME(0), TID INT);
 
INSERT INTO toto VALUES 
(1, '12:00', 1),
(1, '12:30', 2),
(1, '13:00', 3),
(2, '16:00', 1),
(2, '17:00', 2),
(2, '17:30', 3),
(2, '18:00', 3),
(2, '19:00', 3),
(3, '11:00', 1),
(3, '11:30', 2),
(3, '12:00', 3),
(3, '13:00', 3);
Merci de respecter la charte de postage ! http://www.developpez.net/forums/d96...vement-poster/

la solution :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
WITH T AS (
SELECT FID, Heure, TID, 
       ROW_NUMBER() OVER(PARTITION BY FID ORDER BY Heure) AS N,
       ROW_NUMBER() OVER(PARTITION BY FID ORDER BY Heure DESC) AS M
FROM   toto)
SELECT T1.FID, T1.Heure, T2.Heure, T3.Heure
FROM   T AS T1
       INNER JOIN T AS T2
             ON T1.FID = T2.FID
       INNER JOIN T AS T3
             ON T1.FID = T3.FID
WHERE  T1.N = 1
  AND  T2.N = 2             
  AND  T3.M = 1
La résultat :
Code :
1
2
3
4
5
6
 
FID         Heure            Heure            Heure
----------- ---------------- ---------------- ----------------
1           12:00:00         12:30:00         13:00:00
2           16:00:00         17:00:00         19:00:00
3           11:00:00         11:30:00         13:00:00
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h53.


 
 
 
 
Partenaires

Hébergement Web