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 :

Liste des jours incomplète


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Points : 25
    Points
    25
    Par défaut Liste des jours incomplète
    Bonjour,

    J'ai le paramétrage suivant qui me permet de regrouper les jours en "intervalles" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE TABLE INTERVALLE_JOUR
        (CODE_INTERVALLE CHAR(2),
        NOM_INTERVALLE VARCHAR(255),
        NUMERO_JOUR SMALLINT)
     
    INSERT INTERVALLE_JOUR
    SELECT '00', 'AUTRES JOURS', 0
    UNION
    SELECT 'EF', 'JOUR ENFANT', 4
    UNION
    SELECT 'CO', 'JOUR COURSES', 7
    UNION
    SELECT 'RE', 'JOUR REPOS', 1
    Je désirerai obtenir la liste suivante
    JOUR | CODE_INTERVALLE
    1 | RE
    2 | 00
    3 | 00
    4 | EF
    5 | 00
    6 | 00
    7 | CO

    J'ai pensé à
    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
     
    SELECT	1 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 1
    		)	
    UNION
    SELECT	2 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 2
    		)	
    UNION
    SELECT	3 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 3
    		)	
    UNION
    SELECT	4 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 4
    		)	
    UNION
    SELECT	5 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 5
    		)	
    UNION
    SELECT	6 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 6
    		)	
    UNION
    SELECT	7 AS JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NOT EXISTS (
    		SELECT	*
    		FROM	INTERVALLE_JOUR (NOLOCK)
    		WHERE	NUMERO_JOUR = 7
    		)	
    UNION
    SELECT	NUMERO_JOUR, CODE_INTERVALLE
    FROM	INTERVALLE_JOUR
    WHERE	NUMERO_JOUR <> 0
    Mais ce me semble redondant et un peu lourd. On pourrait arguer que le paramétrage pourrait se faire pour les 7 jours, mais les valeurs par défaut sont bien pratiques quand même...

  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,

    Vous pouvez faire ainsi :

    Code SQL : 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
     
    WITH J AS (
        SELECT 1 AS Jour
        UNION ALL
        SELECT Jour + 1
        FROM J
        WHERE Jour < 7
    )
    SELECT 
        Jour, 
        COALESCE(
            CODE_INTERVALLE, 
            Defaut.CODE_INTERVALLE
        ) AS CODE_ INTERVALLE
    FROM J
    LEFT OUTER JOIN INTERVALLE_JOUR I
        ON J.Jour = I.NUMERO_JOUR
    INNER JOIN INTERVALLE_JOUR Defaut 
        ON Defaut.NUMERO_JOUR = 0

    Vous pourriez créer une table contenant les jours de 1 à 7 pour éviter la CTE...

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 917
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 917
    Points : 51 693
    Points
    51 693
    Billets dans le blog
    6
    Par défaut
    Le mieux, car plus performant est d'utiliser une table de calendrier comme je l'ai indiqué dans cet article : http://sqlpro.developpez.com/cours/gestiontemps/

    A +

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Mais ce WITH ne fonctionne pas sous SQL Server 2000 (et j'ai oublié de le préciser ) ?

  5. #5
    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 darKStein Voir le message
    Mais ce WITH ne fonctionne pas sous SQL Server 2000 (et j'ai oublié de le préciser ) ?
    ha oui...

    il suffit de s'en passer :

    Code SQL : 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
     
    SELECT 
        Jour, 
        COALESCE(
            CODE_INTERVALLE, 
            Defaut.CODE_INTERVALLE
        ) AS CODE_ INTERVALLE
    FROM (
        SELECT 1 UNION ALL
        SELECT 2 UNION ALL
        SELECT 3 UNION ALL
        SELECT 4 UNION ALL
        SELECT 5 UNION ALL
        SELECT 6 UNION ALL
        SELECT 7
    ) J(Jour) 
    LEFT OUTER JOIN INTERVALLE_JOUR I
        ON J.Jour = I.NUMERO_JOUR
    INNER JOIN INTERVALLE_JOUR Defaut 
        ON Defaut.NUMERO_JOUR = 0

    Vous pourriez remplacer cette pseudo table par une vraie table et vous inspirer en effet de l'article de SQLPro...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Mai 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Mai 2011
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Merci pour ces réponses !

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Le mieux, car plus performant est d'utiliser une table de calendrier comme je l'ai indiqué dans cet article : http://sqlpro.developpez.com/cours/gestiontemps/
    J'étais un peu réticent à mettre ce genre de table de calendrier en place mais, après avoir testé, je ne peux plus m'en passer.
    Dernière modification par Waldar ; 25/05/2011 à 15h15. Motif: Grammaire

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

Discussions similaires

  1. [DOM] Liste des ID incomplète
    Par gemine dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 02/02/2009, 16h25
  2. [SQL Server 2000] Liste des jours d'un mois donné
    Par luimême dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 23/04/2008, 11h27
  3. Liste des opérateurs incomplètes BO 6.5
    Par stisud dans le forum Administration-Migration
    Réponses: 2
    Dernier message: 05/04/2007, 09h22
  4. Réponses: 2
    Dernier message: 06/11/2006, 14h35
  5. Générer le listing des jours entre deux dates
    Par gsmdu62 dans le forum Langage
    Réponses: 8
    Dernier message: 01/05/2006, 11h08

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