IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

SQL Server 2008 : Problème requête


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Points : 5
    Points
    5
    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.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est un PIVOT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    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.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Il suffit de décomposer, sans le group by :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 772
    Points : 52 732
    Points
    52 732
    Billets dans le blog
    5
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

Discussions similaires

  1. Installation SQL Server 2008 - Problème de Framework
    Par BiBloOo dans le forum Administration
    Réponses: 10
    Dernier message: 07/03/2010, 22h10
  2. [SQL SERVER 2005]problème requête dans un trigger
    Par Kropernic dans le forum Développement
    Réponses: 14
    Dernier message: 02/03/2010, 18h20
  3. [SQL SERVER 2008] problème agent de journal
    Par Hydre dans le forum Réplications
    Réponses: 0
    Dernier message: 27/05/2009, 15h00
  4. SQL server 2008 Problème de lecture seule
    Par Kalion dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 02/03/2009, 13h20
  5. [INSTALLATION SQL SERVER 2008]Problème de comptes
    Par sarapis dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 09/08/2008, 17h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo