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 :

Requête récursive CTE avec une condition à vérifier


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut Requête récursive CTE avec une condition à vérifier
    Comme les données sont confidentielles, j'ai créé deux tables exemple pour vous .
    J'ai de la misère à faire cette boucle.

    Premièrement, les personnes peuvent avoir plusieurs éléments ainsi des dates correspondant à cela.
    Alors on prend dans la jointure de deux tabls , seulement la date qui concorde c’est a dire Date_Per(2006) ( from table salary)=Date_element (2006) (from my table)
    After that je fais le recursive sur la Year(date_per)-1 tant que l’élément 1 n’est pas null et l’élément 2 est nul , dans le données ci-dessous, on voit qu’à la cinquième étape l’élément 1 est null et l’élément 2 n’est pas null donc on arrête la boucle car cela ne répond pas à notre critère et on affiche l’année

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    set dateformat 'ymd'
    Drop table #salary
    CREATE TABLE #salary(
        ID_Personne int IDENTITY(1,1) PRIMARY KEY ,
        DATE_Per Date
    )
     
     
     
    --This is the data of my table:
    INSERT INTO #salary VALUES ('2015-05-10')
    INSERT INTO #salary VALUES ('2019-05-10')
    INSERT INTO #salary VALUES ('2017-02-18')
    INSERT INTO #salary VALUES ('2019-10-05')
    INSERT INTO #salary VALUES ('2010-08-25')
    INSERT INTO #salary VALUES ('2018-08-10')
    INSERT INTO #salary VALUES ('2004-09-13')
    INSERT INTO #salary VALUES ('2005-04-10')
    INSERT INTO #salary VALUES ('2018-02-14')
    INSERT INTO #salary VALUES ('2014-05-10')
    INSERT INTO #salary VALUES ('2019-12-12')
    INSERT INTO #salary VALUES ('2018-08-13')
    INSERT INTO #salary VALUES ('2011-01-18')
    INSERT INTO #salary VALUES ('2009-09-19')
    INSERT INTO #salary VALUES ('2005-05-19')
    INSERT INTO #salary VALUES ('2008-04-10')
    INSERT INTO #salary VALUES ('2018-02-14')
    INSERT INTO #salary VALUES ('2018-05-10')
    INSERT INTO #salary VALUES ('2018-12-12')
    INSERT INTO #salary VALUES ('2017-08-13')
    INSERT INTO #salary VALUES ('2013-08-05')
    INSERT INTO #salary VALUES ('2009-07-25')
    INSERT INTO #salary VALUES ('2005-05-19')
     
     
     
    Drop table #myTable
    CREATE TABLE #myTable(
        ID_element int IDENTITY(200,1) PRIMARY KEY ,
        Element1 nvarchar(10),
    	Element2 nvarchar(10),
    	DATE_Ele Date,
    	ID_Personne int
        FOREIGN KEY (ID_Personne)
        REFERENCES #salary (ID_Personne)
     
    )
     
    INSERT INTO #myTable VALUES ('A','B','2011-01-18',1)
    INSERT INTO #myTable VALUES ('A','B','2009-09-19',2)
    INSERT INTO #myTable VALUES ('A','B','2005-05-19',3)
    INSERT INTO #myTable VALUES ('A','B','2008-04-10',4)
    INSERT INTO #myTable VALUES ('A','B','2018-02-14',5)
    INSERT INTO #myTable VALUES ('A','B','2018-05-10',6)
    INSERT INTO #myTable VALUES ('A','B','2018-12-12',7)
    INSERT INTO #myTable VALUES ('A','B','2004-03-20',8)
    INSERT INTO #myTable VALUES ('A',NULL,'2018-02-14',9)
    INSERT INTO #myTable VALUES ('A',NULL,'2014-02-14',9)
    INSERT INTO #myTable VALUES ('A',NULL,'2015-02-14',9)
    INSERT INTO #myTable VALUES ('A','B','2013-02-14',9)
    INSERT INTO #myTable VALUES ('A',NULL,'2014-05-10',10)
    INSERT INTO #myTable VALUES ('A',NULL,'2019-12-12',11)
    INSERT INTO #myTable VALUES ('A',NULL,'2019-10-05',4)
    INSERT INTO #myTable VALUES ('A',NULL,'2010-08-25',5)
    INSERT INTO #myTable VALUES ('A',NULL,'2009-08-25',5)
    INSERT INTO #myTable VALUES ('A',NULL,'2008-08-25',5)
    INSERT INTO #myTable VALUES ('A','B','2007-03-25',5)
    INSERT INTO #myTable VALUES ('A',NULL,'2018-08-10',6)
    INSERT INTO #myTable VALUES ('A',NULL,'2004-09-13',7)
    INSERT INTO #myTable VALUES ('A',NULL,'2005-04-10',8)
    INSERT INTO #myTable VALUES ('A',NULL,'2009-07-25',10)
    INSERT INTO #myTable VALUES ('A',NULL,'2005-05-19',11)
    INSERT INTO #myTable VALUES ('A','B','2004-05-19',11)
    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
    Drop table #cteReports15
    ;WITH
      cteReports (ID_Personne, Annee)
      AS
      (
        SELECT t.ID_Personne, Year(t.DATE_Per) as Annee 
        FROM #salary as t
    	Inner Join #myTable  as a
    	ON t.ID_Personne=a.ID_Personne
    	AND t.DATE_Per=a.DATE_Ele
    	where a.Element1 is not null AND a.Element2 is null
     
        UNION ALL
        SELECT t.ID_Personne, Year(t.DATE_Per)-1 as Anneef 
       FROM #salary as t
    	Inner Join #myTable  as a
    	ON t.ID_Personne=a.ID_Personne
    	AND t.DATE_Per=a.DATE_Ele
    	Inner Join cteReports
    	on cteReports.ID_Personne=a.ID_Personne
     
      )
      --Drop table #cteReports11
      Select Distinct ID_Personne, Annee 
    INTO		#cteReports15
    FROM		cteReports
    OPTION (MAXRECURSION 1000);

    Merci pour votre aide

  2. #2
    Membre émérite 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 : 45
    Localisation : France, Oise (Picardie)

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

    Informations forums :
    Inscription : Novembre 2011
    Messages : 327
    Par défaut Incomprehension
    Bonjour,

    Je ne comprend pas le besoin qui a mener a ta requette , peux-tu nous donner sur ton exemple le résultat attendu et les règles de gestion que tu appliqué pour arrivé a ce résultat ?

    De plus tu parle de récursion mais ton code ne comporte aucune récursion pour avoir une récursion ta CTE cteReports devrai s'appeler dans la 2ème partie de ton Union All .

  3. #3
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2012
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2012
    Messages : 5
    Par défaut
    BOnjour ,

    Merci pour ton reponse
    Par exemple dans cette table J'ai cette ID_Personne qui a plusieurs element ainsi des dates correspondants a cette element.

    Dans un premier temps je fais la jointure avec un autre table

    ---données du table Personne
    
    ID_Personne       Date_Per
    1                       2007
    --Données du table element 
    ID_element Element1 Element2   DATE_Ele      ID_Personne
            1       NULL         25                2002            1
            2       46         NULL             2003                     1
            3       2           NULL              2004                      1
            4       3          NULL            2005                      1
            5       5          NULL           2006                      1
            6      178      NULL         2007                     1
    Dans un premier temps je fais la jointure entre le deux table par le lien ID_Personne et je prend le deux date correspondant
    donc ce qui donne comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select ID_Personne,Date_Per,Element1 ,Element2 ,DATE_Ele       
    from Personne as P
    Inner Join element as c
    ON C.ID_Personne=P.ID_Personne
    AND Date_Per=DATE_Ele
    donc dans notre cas l'année 2007 declenche le depart du boucle pour decrementer-1
    mais il faut verifier que dans l'année 2007 si l'element1 n'est pas null et l'element2 est null , tant que cette condition est vérifié , on continue la décrémentation sur la date sur la date_Personne en verifiant ainsi de suite
    jusqu'à ce que la condition n'est pas respecté , dans cette exemple l'année 2002 ne repond pas a notre critere car l'element1 est null et l'element2 n'est pas null donc on arrete notre boucle .
    J'espere que suis assez claire maintenant

Discussions similaires

  1. Requête avec une condition, est-ce possible ?
    Par le_chomeur dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/07/2010, 16h10
  2. [PDO] Générer une requête avec une condition IN
    Par comode dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 11/05/2009, 22h17
  3. Comment regrouper avec une condition dans une requête
    Par moilou2 dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/07/2008, 10h39
  4. Réponses: 3
    Dernier message: 08/05/2007, 17h32
  5. Problème de requête avec une condition IN
    Par sorcer1 dans le forum Langage SQL
    Réponses: 5
    Dernier message: 20/10/2005, 11h56

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