Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
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 31/03/2011, 12h03   #1
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Par défaut Requête pour multiplier des lignes selon des bornes

Bonjour,
Le titre n'est peut-être pas explique mais ce que je souhaite est de répéter des lignes d'une table A selon les valeurs d'une table B.
Le bout de script suivant et quelques explications permettront de comprendre je pense.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
WITH tabA AS (
	SELECT 201101 AS date, 'A' AS val UNION ALL
	SELECT 201103, 'B' UNION ALL
	SELECT 201107, 'C'
),
tabB AS (
	SELECT 201101 AS date UNION ALL
	SELECT 201102 AS date UNION ALL
	SELECT 201103 AS date UNION ALL
	SELECT 201104 AS date UNION ALL
	SELECT 201105 AS date UNION ALL
	SELECT 201106 AS date UNION ALL
	SELECT 201107 AS date UNION ALL
	SELECT 201108 AS date UNION ALL
	SELECT 201109 AS date 	
)
SELECT 
	tabA.val 
	, tabA.date AS dateval
	, tabB.date AS date
FROM tabA, tabB
La table A représente des valeurs valable à date.
La table B représente une liste de dates pour lesquelles je souhaite obtenir les valeurs valables.

Je souhaite donc filtrer la requête précédente pour n'obtenir quel les lignes pour lesquelles la valeur courante est toujours valable, i.e. il n'y a pas eu de nouvelle définition de valeur.

Le résultat souhaité devrait être celui-ci :
Code :
1
2
3
4
5
6
7
8
9
SELECT 201101 AS date, 'A' AS val UNION ALL
SELECT 201102 AS date, 'A' AS val UNION ALL
SELECT 201103 AS date, 'B' AS val UNION ALL
SELECT 201104 AS date, 'B' AS val UNION ALL
SELECT 201105 AS date, 'B' AS val UNION ALL
SELECT 201106 AS date, 'B' AS val UNION ALL
SELECT 201107 AS date, 'C' AS val UNION ALL
SELECT 201108 AS date, 'C' AS val UNION ALL
SELECT 201109 AS date, 'C' AS val
Merci pour votre aide.
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 13h32   #2
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Citation:
Le résultat souhaité devrait être celui-ci :
Code :
SELECT 201101 AS date, 'A' AS val UNION ALL
SELECT 201102 AS date, 'A' AS val UNION ALL
SELECT 201103 AS date, 'B' AS val UNION ALL
SELECT 201104 AS date, 'B' AS val UNION ALL
SELECT 201105 AS date, 'B' AS val UNION ALL
SELECT 201106 AS date, 'B' AS val UNION ALL
SELECT 201107 AS date, 'C' AS val UNION ALL
SELECT 201108 AS date, 'C' AS val UNION ALL
SELECT 201109 AS date, 'C' AS val
Merci pour votre aide.
Bonjour,

Vous devez simplement faire un CROSS JOIN de vos deux tables

Code :
FROM tabA CROSS JOIN  tabB
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 13h42   #3
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Le problème comme cela est que toutes les valeurs sont répétées pour toutes les dates.
Or je ne souhaite pas obtenir les lignes non valables ; Comme par exemple :

201103 A
201104 A
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 14h00   #4
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,

Avec ceci par exemple :
Code SQL :
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
 
WITH tabA AS (
	SELECT 201101 AS dte, 'A' AS val UNION ALL
	SELECT 201103, 'B' UNION ALL
	SELECT 201107, 'C'
),
tabB AS (
	SELECT 201101 AS dte UNION ALL
	SELECT 201102 AS dte UNION ALL
	SELECT 201103 AS dte UNION ALL
	SELECT 201104 AS dte UNION ALL
	SELECT 201105 AS dte UNION ALL
	SELECT 201106 AS dte UNION ALL
	SELECT 201107 AS dte UNION ALL
	SELECT 201108 AS dte UNION ALL
	SELECT 201109 AS dte 	
),
bornes AS (
	SELECT deb.dte AS debut, 
		(
			SELECT MIN(dte) 
			FROM tabA fin 
			WHERE fin.dte > deb.dte
		) AS fin ,
		deb.val 
	FROM tabA deb
)
SELECT bornes.val, tabB.dte
FROM tabB
LEFT OUTER JOIN bornes 
	ON tabB.dte >= bornes.debut
	AND (tabB.dte < bornes.fin OR bornes.fin IS NULL)
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/03/2011, 14h05   #5
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
Ahh mais c'est parfait !!!
Merci beaucoup

Super pour la réactivité.
Jinroh77 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 03h49.


 
 
 
 
Partenaires

Hébergement Web