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

MS SQL Server Discussion :

Détecter un changement de valeur d'une ligne à 'autre dans une requête


Sujet :

MS SQL Server

  1. #1
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut Détecter un changement de valeur d'une ligne à 'autre dans une requête
    Bonjour à tou(te)s,

    J'ai un petit souci avec une requête. Je liste des évènements qui ont lieu dans le sens chronologique. Chaque évènement fait partie d'une phase. Il y a donc tout une suite d'évènements dans une phase. Le problème c'est qu'une phase peut avoir lieu plusieurs fois, et autant ma requête je la trie parle temps, autant en voulant afficher ca avec Reporting Services, je groupe par numéro de Phase.

    Dès lors, chaque phase affiche tous ces évènements, mais par Phase, je n'ai donc qu'une seule fois chaque phase affichée, et chacune contient tous les évènements de toutes les phases identiques du process. (je ne suis pas sur d'être clair).

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Phase   Horodatage    Evenement
    1         17:30:00    bla bla bla...
    1         17:30:01    bla bla bla...
    2         17:30:02    bla bla bla...
    2         17:30:03    bla bla bla...
    2         17:30:04    bla bla bla...
    1         17:30:05    bla bla bla...
    1         17:30:06    bla bla bla...
    J'affiche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Phase 1
    Horodatage   Evenement
    17:30:00     bla bla bla...
    17:30:01     bla bla bla...
    17:30:05     bla bla bla...
    17:30:06     bla bla bla...
    Phase 2
    Horodatage   Evenement
    17:30:02     bla bla bla...
    17:30:03     bla bla bla...
    17:30:04     bla bla bla...
    Je souhaiterai donc pouvoir "situer" le changement de phase afin d'avoir une sorte de compteur pour obtenir une requête contenant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Phase   Horodatage   Evenement        Compteur
    1         17:30:00    bla bla bla...  1
    1         17:30:01    bla bla bla...  1
    2         17:30:02    bla bla bla...  2
    2         17:30:03    bla bla bla...  2
    2         17:30:04    bla bla bla...  2
    1         17:30:05    bla bla bla...  3
    1         17:30:06    bla bla bla...  3
    Si vous avez des idées

  2. #2
    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 : 42
    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,

    Quelle version de SQL Server utilisez-vous ?
    Les solutions sont différentes suivant que vous utilisez SQL Server 2000 ou ultérieur ...

    @++

  3. #3
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Il s'agit de SQL 2005, je n'avaispas pensé à le spécifier puisque jeparlais de Reporting Services, ca me semblait évident

  4. #4
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Si j'ai bien compris, et vu le caractère non ensembliste du traitement, vous voulez calculer cette dernière colonne dans Reporting Services.

    Il y a quelques fonctions sympas dans reporting services, notamment previous.

    @+

  5. #5
    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 : 42
    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
    l s'agit de SQL 2005, je n'avaispas pensé à le spécifier puisque jeparlais de Reporting Services, ca me semblait évident
    Malheureusement non, car il existe SQL Server 2000 Reporting Services.

    Suivez le conseil d'agemis31, vous gagnerez autant en performances qu'en temps de développement (même si techniquement votre problème est intéressant)

    @++

  6. #6
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Eh bien j'avoue que j'ai essayé d'utiliser Previous, mais malheureusement cela se fait une fois le dataset créé, et je ne peux pas faire de groupement sur cette "nouvelle colonne". J'affiche donc un entête de groupe uniquement si le Previous est différent. Mais alors je ne peux plus faire d'aggrégats sur le groupe (style nombre de lignes, temps total de durée, etc...)

    En sql, j'avais fait une fonction qui ouvrait un curseur et parcourait toutes les lignes, mais c'est plutot de l'ordre de la machine à gaz et j'ai abandonné

  7. #7
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour,

    Je n'ai pas de Reporting Services fonctionnel sous la main pour essayer.

    Je me lance en TSQL alors:

    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
    declare @t table (Phase int, Horodatage datetime, Evenement varchar(50))
    insert into @t select 1, '20090705 17:30:00', 'bla bla 1'
    insert into @t select 1, '20090705 17:30:01', 'bla bla 2'
    insert into @t select 2, '20090705 17:30:02', 'bla bla 3'
    insert into @t select 2, '20090705 17:30:03', 'bla bla 4'
    insert into @t select 2, '20090705 17:30:04', 'bla bla 5'
    insert into @t select 2, '20090705 17:30:05', 'bla bla 5'
    insert into @t select 1, '20090705 17:30:06', 'bla bla 6'
    insert into @t select 1, '20090705 17:30:07', 'bla bla 7'
    insert into @t select 2, '20090705 17:30:08', 'bla bla 8'
     
    ;WITH cte AS
    (
    SELECT Phase, Horodatage, Evenement, 
    	ROW_NUMBER() OVER 
    		(ORDER BY Horodatage) - 
    	ROW_NUMBER() OVER 
    		(PARTITION BY Phase ORDER BY Horodatage) AS Delta
    FROM @t
    )
    SELECT Phase, Horodatage, Evenement, 
    DENSE_RANK() OVER (ORDER BY Delta, Phase) AS Rang 
    FROM cte  
    ORDER BY Horodatage
    En espérant que ça marche

    @+

  8. #8
    Membre confirmé
    Avatar de Mindiell
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    735
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 735
    Points : 546
    Points
    546
    Par défaut
    Un peu de temps avant de répondre, mais ca a parfaitement marché. Je n'ai pas tout à fait utilisé ta requête, mais les row_number m'ont parfaitement servi !

    Merci énormément à toi

  9. #9
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonjour Mindiell,

    Content que ça t'ai aidé

    @+

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

Discussions similaires

  1. [XL-2010] Recherche dans une ligne à partir d'une valeur
    Par icem4n dans le forum Excel
    Réponses: 7
    Dernier message: 15/07/2014, 14h50
  2. Réponses: 1
    Dernier message: 04/04/2013, 21h06
  3. Réponses: 3
    Dernier message: 29/03/2011, 20h38
  4. Réponses: 14
    Dernier message: 24/05/2006, 16h05
  5. Imposer une valeur dans une ligne "identity" d'une
    Par mibo94 dans le forum Access
    Réponses: 1
    Dernier message: 26/11/2005, 16h59

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