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

Langage SQL Discussion :

Récapitulatif par état


Sujet :

Langage SQL

  1. #1
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut Récapitulatif par état
    Bonjour,

    j'ai une table (un peu moche il est vrai) d'historisation d'état :
    TABLE T(ID int, DATE datetime not null, COMMENTAIRE varchar(100) ETAT, varchar(20) not null)
    ID DATE COMMENTAIRE ETAT
    11309 2014-10-01 09:07:53.000 'test1' Création
    11310 2014-10-01 09:08:25.000 'test2' Création
    11311 2014-10-01 09:08:37.000 'toujours en création' Création
    11313 2014-10-01 09:23:44.000 'passage en formulé' Formulée
    11314 2014-10-01 09:23:56.000 'problème de donnée' Formulée
    11315 2014-10-01 09:25:23.000 'repassage en création un bug s''est produit' Création

    J'aimerais réaliser une requête de façon à obtenir un listing par suite de même état (afin d'avoir une ligne par état)
    IDS ETAT
    11309,11310,11311 Création
    11313,11314 Formulée
    11315 Création

    J'ai pensé à faire une procédure stockée avec une boucle while mais j'aimerais savoir si c'est faisable en une requête (si oui je ne vois pas la façon, peut-être avec une CTE complexe ?) ?
    Mon problème est la gestion des états Etat1 -> Etat2 -> Etat1 (ne prendre que les X lignes de l'état Etat1 avant changement d'état)

    Mon SGBD : Sql Server 2008 R2

    Merci par avance.

  2. #2
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    une des solutions est de passer par les fonctionalité XML

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT   Distinct    Etat,
                STUFF((    SELECT ',' + cast (d.ID  as nvarchar(255)) 
                            FROM TA_TABLE d
                            WHERE
                            g.Etat = d.Etat
                            FOR XML PATH('') 
                            ), 1, 1, '' )
     
                AS IDS
    FROM  TA_TABLE

  3. #3
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Bonjour Séverine, merci pour ta réponse rapide.
    Néanmoins cela ne correspond pas tout à fait à ma demande puisque le résultat de la requête mise en oeuvre donne cela :
    Création 11309,11310,11311,11315
    Formulée 11313,11314

    Or j'aimerais garder une historisation et donc avoir une ligne pour 11315 ainsi :
    Création 11309,11310,11311
    Formulée 11313,11314
    Création 11315

    (on est revenus dans l'état 1 après l'état 2)

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Vous pouvez passer par une récursive :

    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
     
    WITH R AS (
    	SELECT CAST(ID AS VARCHAR(MAX)) as id, etat, ROW_NUMBER() OVER(ORDER BY ID) AS Rn
    	FROM T
    )
    ,CTE AS (
    	SELECT ID, etat, rn, 1 as phase
    	FROM R 
    	WHERE rn = 1
    	UNION ALL
    	SELECT 
    		CASE WHEN R.etat = CTE.etat 
    			THEN cte.ID + ',' + R.id 
    			ELSE r.ID 
    		END, 
    		R.etat, 
    		R.rn,
    		CASE WHEN R.etat = CTE.etat 
    			THEN cte.phase 
    			ELSE cte.phase + 1
    		END
    	FROM CTE
    	INNER JOIN R 
    		ON r.rn = CTE.rn + 1
    )
    SELECT MAX(ID) as res, etat
    FROM  cte 
    GROUP BY etat, phase
    ORDER  BY phase

  5. #5
    Membre éclairé Avatar de GeekMokona
    Femme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Novembre 2011
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 44
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Points : 817
    Points
    817
    Par défaut
    Essai
    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
     
    With Rnum as (
    select 
    Row_number() over( Order by Date) as rNum,
    [ID] as ID
               ,[Etat] as etat
    from TA_TABLE),
    rec as 
    (
    Select ID, etat , 1 as Etape , rNum
    From rnum
    Where rNum = 1
    union All
    Select rnum.ID , rNum.etat ,
    Case 
    When rec.Etat != Rnum.etat  then Etape + 1
    Else Etape 
    End as Etape
    ,Rnum.rNum 
    From Rnum
    INNER Join rec 
    on (rnum.rNum = rec.rNum+1)
    )
    SELECT   DISTINCT    Etat,Etape,
     
                STUFF((    SELECT ',' + cast (d.ID  AS nvarchar(255)) 
                            FROM rec d
                            WHERE
                            g.Etat = d.Etat and g.Etape = d.Etape
                            FOR XML PATH('') 
                            ), 1, 1, '' )
     
                AS IDS
    FROM  rec g

  6. #6
    Membre actif
    Étudiant
    Inscrit en
    Avril 2008
    Messages
    311
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2008
    Messages : 311
    Points : 257
    Points
    257
    Par défaut
    Merci à vous deux, vos deux solutions fonctionnent parfaitement !
    (J'arrête de faire ma procédure stockée)

    Je ne savais pas qu'on pouvait utiliser plusieurs CTE et j'ai aussi découvert STUFF (mieux que SUBSTRING pour le XML path) !
    Je passe en validé !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD16] Problème d'exportation d'un état modifié par états et requetes
    Par rassebane dans le forum WinDev
    Réponses: 0
    Dernier message: 12/04/2014, 13h37
  2. Imprimante par défaut par état
    Par XavierRT dans le forum SAP Crystal Reports
    Réponses: 0
    Dernier message: 13/12/2011, 11h19
  3. Tri par état obligatoire
    Par xanav dans le forum QlikView
    Réponses: 4
    Dernier message: 23/11/2011, 15h08
  4. [CR9] publication d'états par RAS
    Par youl dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 10/07/2003, 18h26

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