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 :

Combler les trous de valeur dans un calendrier


Sujet :

Développement SQL Server

  1. #1
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut Combler les trous de valeur dans un calendrier
    Bonjour

    Je duspose d'une table Calendrier Cal
    Et d'une Table d'affectation par Date TA

    Le probleme c'est Que la table TA ne donne que les changemetns d'affectation

    Citation Envoyé par Table Affectation
    2014-09-01 : Marcel
    2014-09-05 : Jean
    2014-08-10 : Pierre
    Je voudrais faire une jointure sur ma table Cal pour combler les "Trous'
    Meci de votre aide


    Citation Envoyé par Resultat
    2014-09-01 : Marcel
    2014-09-03 : Marcel
    2014-09-04 : Marcel

    2014-09-05 : Jean
    2014-09-06 : Jean
    2014-09-07 : Jean
    2014-09-08 : Jean
    2014-09-09 : Jean

    2014-08-10 : Pierre

  2. #2
    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

    Quelle est votre version de SQL server ?
    A partir de la version 2012, vous pourriez utiliser LEAD dans une première CTE afin d'obtenir les dates de début et fin.

    Comme il me semble que vous avez une version plus ancienne, vous pouvez faire comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT CalDate, a.nom
    FROM Calendar c
    LEFT JOIN affectation a
    	on a.dte <= c.caldate
    LEFT JOIN affectation b
    	ON b.dte <= c.caldate
    	AND b.dte > a.dte
    WHERE b.dte IS NULL

  3. #3
    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
    Citation Envoyé par aieeeuuuuu Voir le message
    A partir de la version 2012, vous pourriez utiliser LEAD dans une première CTE afin d'obtenir les dates de début et fin.
    Celà dit, vous pourriez l'émuler de la fonçon suivante, qui sera probablement plus performante que la requête que j'avais proposé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
     
    WITH tmp as (
    	SELECT 
    		dte
    		, nom
    		, ROW_NUMBER() OVER(ORDER BY dte) as Rn
    	FROM affectation
    ), 
    bornes as (
    	SELECT 
    		dte AS debut
    		, nom
    		,CASE 
    			WHEN Rn%2 =  0 THEN MAX(dte) OVER(PARTITION BY RN/2) 
    			ELSE MAX(dte) OVER(PARTITION BY (RN-1)/2) 
    		END AS Fin
    	FROM  tmp
    )
    SELECT 
    	calDate
    	, nom
    FROM calendar
    LEFT JOIN Bornes
    	ON Bornes.debut <= Caldate
    	AND (Bornes.Fin > CalDate or debut= fin)
    ORDER BY caldate

  4. #4
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Merci Aieeeuu
    Ou c'est effectivement la bonne solution que j'avais fini par trouver

    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
    WITH AA AS (
    SELECT 
           ROW_NUMBER() OVER(ORDER BY DateUpdate) AS RowId
          ,[Key]
          ,[Name]
          ,[dateUpdate]
          ,[ISOCC]
      FROM [HaPI].[dbo].[Affectation]
      WHERE Key='QAR' 
      ), NNN AS (
      SELECT 
      AA.rowid,
      AA.Key,
      AA.Name,
      AA.Dateupdate DA,
      BB.Dateupdate DB
      FROM AA
      INNER JOIN AA BB ON BB.rowid=aa.rowid+1
      UNION 
      SELECT 
      AA.rowid,
      AA.Key,
      AA.Name,
      AA.Dateupdate DA,
      Getdate() DB
      FROM AA WHERE aa.rowid=(SELECT MAX(rowid) from aa))
      SELECT 
      c.date_id,
      NNN.Name
      FROM opdata.dbo.Calendar c
      INNER JOIN NNN on c.date_id between NNN.DA and NNN.db

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 20
    Points : 16
    Points
    16
    Par défaut
    Bonjour,

    J'ai le même besoin à savoir une table TT_ANNEE contenant un seul champ année ANNEE allant de 1990 à 2015.
    Et je voudrais combler les trous d'une autre table TT_RES qui contient les champs : dossier, garantie, année

    contenu de TT_RES :

    5000, A, 1992
    5000, B, 1994
    5000, C, 2000

    Résultat à obtenir dans TT_RES :
    5000, A, 1990
    5000, A, 1991
    5000, A, 1992
    5000, A, 1993
    5000, B, 1994
    5000, B, 1995
    5000, B, 1996
    5000, B, 1997
    5000, B, 1998
    5000, B, 1999
    5000, C, 2000
    5000, C, 2001 ... jusqu'à 2015

    J'ai essayé avec la requête proposée dans la réponse de aieeeuuuuu mais cela ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT   G_T0.TT_ANNEE, G_T1.*
    from TT_ANNEE G_T0
    left  join TT_RES G_T1 
    on G_T1.tt_anneeres <= G_T0.ANNEE 
    left join TT_RES G_T2
    on G_T2.tt_anneeres <= G_T0.ANNEE 
    and G_T2.tt_anneeres > G_T1.tt_anneeres 
    where G_T2.tt_anneeres is null
    Merci de votre aide (je ne peux utiliser que cette version).

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/03/2013, 10h15
  2. [XL-2003] Compter les changements de valeur dans une colonne
    Par clem71 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 16/04/2009, 01h09
  3. Combler les trous d'autoNum
    Par Stéphane Olivier BERNARD dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 10/10/2007, 17h25
  4. combler les trous d'un id sous mysql
    Par D.Mounir dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 02/05/2007, 11h29
  5. Combler les trous lors d'une suppression dans une table
    Par Billybongjoe dans le forum PostgreSQL
    Réponses: 5
    Dernier message: 08/04/2004, 15h02

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