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 :

demande d'aide sur une requête sql serveur


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut demande d'aide sur une requête sql serveur
    Bonsoir,

    je me permets de soliciter votre aide.

    J'ai une table avec des événements comme ceci

    Table

    ID | Type | Date | commentaire
    123856 | False | 24/09/2009 10:20:00 | ajout prix
    123859 | True | 24/09/2009 14:00:00 | validation
    123895 | False | 25/09/2009 14:30:00 | ajout prix
    123895 | False | 25/09/2009 15:00:00 | ajout quantite
    123895 | True | 25/09/2009 17:00:00 | validation
    186914 | False | 24/06/2009 14:00:50 | ajout prix
    186914 | True | 25/09/2009 17:00:00 | ajout quantite
    186917 | False | 25/09/2009 15:00:00 | ajout quantite

    Je souhaite faire un view de cette table avec
    uniquement la derniere ligne des actions par rapport à la date et ID.

    exemple
    une view_table
    ID | Type | Date | commentaire
    123895 | True | 25/09/2009 17:00:00 | validation
    186914 | True | 25/09/2009 17:00:00 | ajout quantite
    186917 | False | 25/09/2009 15:00:00 | ajout quantite
    123856 | False | 24/09/2009 10:20:00 | ajout prix
    123859 | True | 24/09/2009 14:00:00 | validation
    est ce que cela est possible? Si oui pourriez vous m'orienter s'il vous plait.
    Merci

    Ps : c'est sur SQL server 2000

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Vous n'avez pas précisé la version de votre SQL Server (il y a de grosses différences entre 2000 et 2005).

    Regardez du côté de la fonction row_number() !

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut
    j ai tenté cela comme requête mais ca me donne pas ce que je souhaite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select ID,Type,Date,commentaire
    from table
    where convert(DateTime,[date],103) = (Select max(convert(DateTime,[Date],103 )) from table)
    Mais il me donne que ca
    ID | Type | Date | commentaire
    123895 | True | 25/09/2009 17:00:00 | validation
    186914 | True | 25/09/2009 17:00:00 | ajout quantite
    186917 | False | 25/09/2009 15:00:00 | ajout quantite
    sauf que j avais deux autre valeur

    123856 | False | 24/09/2009 10:20:00 | ajout prix
    123859 | True | 24/09/2009 14:00:00 | validation
    ne remontent pas.

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    623
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 623
    Points : 1 049
    Points
    1 049
    Par défaut
    Testez cette requète, normalement, ca devrait fonctionner. Par contre, avec les fonctionnalités des versions 2005 ou 2008 que je ne maitrise pas encore très bien, il y a peut etre moyen de faire mieux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select t.id
    	, t.type
    	, t.date
    	, t.commentaire
    from dbo.test t
    	inner join(select id
    					, max(date)as madate
    				from dbo.test
    				group by id
    				)b on t.id = b.id and t.date = b.madate

  5. #5
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonjour,

    En complétant la réponse de Waldar à partir de 2005 cela pourrait donner :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    DECLARE @t TABLE
    (
     ID INT,
     [Type] BIT,
     [Date] DATETIME,
     commentaire VARCHAR(20)
    );
     
    INSERT @t VALUES(123856,'False','24/09/2009 10:20:00','ajout prix'),
    (123859,'True','24/09/2009 14:00:00','validation'),
    (123895,'False','25/09/2009 14:30:00','ajout prix'),
    (123895,'False','25/09/2009 15:00:00','ajout quantite'),
    (123895,'True','25/09/2009 17:00:00','validation'),
    (186914,'False','24/06/2009 14:00:50','ajout prix'),
    (186914,'True','25/09/2009 17:00:00','ajout quantite'),
    (186917,'False','25/09/2009 15:00:00','ajout quantite');
     
    WITH t_boundaries
    AS
    (
     SELECT 
    	ROW_NUMBER() OVER (ORDER BY ID,Date) AS num,
    	* 
     FROM @t
    ),
    t_boundaries_2
    AS
    (
     SELECT 
    	ROW_NUMBER() OVER (ORDER BY ID,Date) AS num2,
    	ID AS ID2,
    	Type AS type2,
    	Date AS date2,
    	commentaire AS commentaire2
     FROM @t
    )
    SELECT 
    	t.ID,
    	t.Type,
    	t.Date,
    	t.commentaire
    FROM t_boundaries t
    LEFT JOIN t_boundaries_2 t2
    ON t.num = t2.num2 - 1 
     AND t.ID = t2.ID2
    WHERE num2 IS NULL
    ORDER BY t.ID;
    ++

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Effectivement la requête de Darkelend devrait fonctionner sur toute version de SQL Server depuis la 2000.
    Comme le disait également Darkelend, vous pouvez écrire sous SQL Server 2005 et 2008 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH
    	CTE_LAST_ACTION AS
    	(
    		SELECT ID, MAX(Date) AS maxDate
    		FROM dbo.maTable
    	)
    SELECT ID, Type, Date, commentaire
    FROM dbo.maTable AS T
    JOIN CTE_LAST_ACTION AS LA
    	ON T.ID = LA.ID
    	AND T.Date = LA.maxDate
    Pour en savoir un peu plus sur les expression de table commune, voyez ici, ici et ici

    @++

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 77
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    je vous remicie de vos attentions à mon égard.

    j'ai testé le script de darkelend car je suis sous SQL serveur 2000

    il semble que j'ai comme même les résultats avec plusieurs ID lorsque les actions sont réalisées au même momment avec des valeurs différentes.

    je vais chercher comment la résoudre.

    Je remerci elsuket et mikedavem aussi pour votre aide.

    merci

  8. #8
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Dans ce cas c'est que vous avez pour le même ID la même date maximale plus d'une fois.
    Vous pouvez le vérifier facilement en exécutant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT T.id, T.Date, COUNT(*)
    FROM @t AS T
    JOIN
    (
    		SELECT id, MAX(date)AS madate
    		FROM @T
    		GROUP BY ID
    ) AS TMP
    ON T.ID = TMP.ID
    AND T.date = TMP.maDate
    GROUP BY T.id, T.Date
    HAVING COUNT(*) > 1
    @++

  9. #9
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Je pensais plutôt à d'autres solutions plus courtes MikeDavem.

    Données :
    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
    29
    30
    DECLARE @T TABLE
    (
     ID INT,
     [TYPE] BIT,
     [DATE] DATETIME,
     COMMENTAIRE VARCHAR(20)
    );
     
    INSERT INTO @T (ID, [TYPE], [DATE], COMMENTAIRE)
    SELECT 123856, 'False', CONVERT(DATETIME, '24/09/2009 10:20:00', 103), 'ajout prix'     UNION ALL
    SELECT 123859, 'True' , CONVERT(DATETIME, '24/09/2009 14:00:00', 103), 'validation'     UNION ALL
    SELECT 123895, 'False', CONVERT(DATETIME, '25/09/2009 14:30:00', 103), 'ajout prix'     UNION ALL
    SELECT 123895, 'False', CONVERT(DATETIME, '25/09/2009 15:00:00', 103), 'ajout quantite' UNION ALL
    SELECT 123895, 'True' , CONVERT(DATETIME, '25/09/2009 17:00:00', 103), 'validation'     UNION ALL
    SELECT 186914, 'False', CONVERT(DATETIME, '24/06/2009 14:00:50', 103), 'ajout prix'     UNION ALL
    SELECT 186914, 'True' , CONVERT(DATETIME, '25/09/2009 17:00:00', 103), 'ajout quantite' UNION ALL
    SELECT 186917, 'False', CONVERT(DATETIME, '25/09/2009 15:00:00', 103), 'ajout quantite';
     
    SELECT * FROM @T;
     
    ID          TYPE  DATE                    COMMENTAIRE
    ----------- ----- ----------------------- --------------------
    123856      0     2009-09-24 10:20:00.000 ajout prix
    123859      1     2009-09-24 14:00:00.000 validation
    123895      0     2009-09-25 14:30:00.000 ajout prix
    123895      0     2009-09-25 15:00:00.000 ajout quantite
    123895      1     2009-09-25 17:00:00.000 validation
    186914      0     2009-06-24 14:00:50.000 ajout prix
    186914      1     2009-09-25 17:00:00.000 ajout quantite
    186917      0     2009-09-25 15:00:00.000 ajout quantite
    SQL Server 2005+
    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
    SELECT TOP (SELECT COUNT(DISTINCT ID) FROM @T)
        ID, [TYPE], [DATE], COMMENTAIRE
    FROM @T
    ORDER BY
        ROW_NUMBER() OVER(PARTITION BY ID ORDER BY [DATE] DESC) ASC,
        ID ASC;
     
    WITH ORDERED_@T AS
    (
    SELECT ID, [TYPE], [DATE], COMMENTAIRE,
           ROW_NUMBER() OVER(PARTITION BY ID ORDER BY [DATE] DESC) AS RK
      FROM @T
    )
    SELECT ID, [TYPE], [DATE], COMMENTAIRE
      FROM ORDERED_@T
     WHERE RK = 1;
     
    ID          TYPE  DATE                    COMMENTAIRE
    ----------- ----- ----------------------- --------------------
    123856      0     2009-09-24 10:20:00.000 ajout prix
    123859      1     2009-09-24 14:00:00.000 validation
    123895      1     2009-09-25 17:00:00.000 validation
    186914      1     2009-09-25 17:00:00.000 ajout quantite
    186917      0     2009-09-25 15:00:00.000 ajout quantite
    J'aime bien la première dans sa construction mais la plus rapide à l'exécution, qui est aussi la plus naturelle en relecture est la seconde.

    SQL Server 2000+

    En plus des solutions d'elsuket et de darkelend, j'aime bien celle-ci qui évite l'utilisation d'une sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      SELECT CAST(SUBSTRING(MAX(CONVERT(VARCHAR(19), [DATE], 120) + CAST(ID     AS VARCHAR)), 20, 10) AS INT    ) AS ID,
             CAST(SUBSTRING(MAX(CONVERT(VARCHAR(19), [DATE], 120) + CAST([TYPE] AS VARCHAR)), 20,  1) AS BIT    ) AS [TYPE],
             MAX([DATE])                                                                                          AS [DATE],
             CAST(SUBSTRING(MAX(CONVERT(VARCHAR(19), [DATE], 120) + COMMENTAIRE            ), 20, 20) AS VARCHAR) AS COMMENTAIRE
        FROM @T
    GROUP BY ID;
     
    ID          TYPE  DATE                    COMMENTAIRE
    ----------- ----- ----------------------- --------------------
    123856      0     2009-09-24 10:20:00.000 ajout prix
    123859      1     2009-09-24 14:00:00.000 validation
    123895      1     2009-09-25 17:00:00.000 validation
    186914      1     2009-09-25 17:00:00.000 ajout quantite
    186917      0     2009-09-25 15:00:00.000 ajout quantite
    Il faut bien maîtriser les différents formats car commettre une erreur est facile, et surtout commenter car ce n'est pas forcément trivial à relire.

Discussions similaires

  1. [11gR2] Demande aide sur une requête SQL
    Par Igname dans le forum SQL
    Réponses: 17
    Dernier message: 08/10/2013, 11h08
  2. Aide sur une requête SQL Server
    Par Morad ISSOULGHANE dans le forum Développement
    Réponses: 4
    Dernier message: 30/09/2009, 12h58
  3. aide sur une requête sql
    Par sanach dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 27/02/2008, 17h43
  4. aide sur une requête sql
    Par sanach dans le forum Développement
    Réponses: 9
    Dernier message: 17/10/2007, 21h42
  5. aide sur une requête sql
    Par sanach dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/10/2007, 21h42

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