Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/05/2011, 10h50   #1
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
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 :
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 :
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...
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 11h33   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Vous pouvez faire ainsi :

Code SQL :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 11h34   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
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 +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 14h38   #4
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Mais ce WITH ne fonctionne pas sous SQL Server 2000 (et j'ai oublié de le préciser ) ?
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h00   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h06   #6
Futur Membre du Club
 
Homme Stéphane Bouvet
Chef de projet MOA
Inscription : mai 2011
Messages : 40
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Bouvet
Âge : 35
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : mai 2011
Messages : 40
Points : 15
Points : 15
Merci pour ces réponses !
darKStein est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 15h12   #7
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
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.
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h25.


 
 
 
 
Partenaires

Hébergement Web