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 10/08/2011, 13h32   #1
Invité de passage
 
Inscription : juillet 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : juillet 2011
Messages : 3
Points : 0
Points : 0
Par défaut Regrouper résultat requête dans while avec union

Bonjour,

J'aimerais "grouper" les résultats de la requête suivante (DB ms sql Server)

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
DECLARE @beginDate Datetime
SET @beginDate = '20110701'
 
DECLARE @count int
SET @count = 1
 
        WHILE @beginDate < '20110801'
        BEGIN
 
                SELECT @beginDate AS 'Date', @count AS 'Count';	      
                SET @beginDate = @beginDate + 1;
                SET @count = @count +1;
 
END
Ici le résultat retourné, est un ensemble de SELECT différents.

Ce que j'aimerais c'est faire un union (all) mais je ne parviens pas à le faire dans le while ?

Merci,
gregWeb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 14h56   #2
Modérateur

 
Avatar de elsuket
 
Homme Nicolas Souquet
Administrateur de base de données
Inscription : janvier 2005
Messages : 4 669
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Souquet
Âge : 30
Localisation : Thaïlande

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

Informations forums :
Inscription : janvier 2005
Messages : 4 669
Points : 8 729
Points : 8 729
Bonjour,

Si vous êtes sous SQL Server 2005 ou plus, vous pouvez réaliser cela à l'aide d'une expression de table commune récursive :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DECLARE @start_date datetime
	, @end_date datetime
 
SELECT	@start_date = '20110701'
	, @end_date = '20110801'
 
;WITH
	CTE AS
	(
			SELECT	@start_date AS start_date
				, 1 AS indice
		UNION ALL
			SELECT	DATEADD(day, 1, start_date)
				, indice + 1
			FROM	CTE
			WHERE	start_date < DATEADD(day, -1, @end_date)
	)
SELECT	start_date
	, indice
FROM	CTE
Sinon :

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
DECLARE @start_date datetime
	, @end_date datetime
	, @indice tinyint
 
SELECT	@start_date = '20110701'
	, @end_date = '20110801'
	, @indice = 1
 
DECLARE @tb_dates TABLE
(
	date_stamp datetime
	, indice tinyint
)
 
WHILE @start_date < @end_date
BEGIN
	INSERT	INTO @tb_dates (date_stamp, indice) VALUES (@start_date, @indice)
 
	SELECT	@start_date = DATEADD(day, 1, @start_date)
		, @indice = @indice + 1
END
 
SELECT	date_stamp
	, indice
FROM	@tb_dates
Attention si vous utilisez une variable de type table par la suite : SQL Server estime toujours qu'il n'y a qu'une et une seule ligne dans une telle table, et cela peut le conduire à faire des estimations de cardinalités incorrectes, et donc à produire des plans de requêtes sous-optimisés.
Veillez dans ce cas à utiliser une table temporaire (CREATE #maTable TABLE), le mieux étant d'avoir une table de dates

@++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes.
Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012
elsuket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2011, 16h45   #3
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

En effet une table des dates serait l'idéal ici

Sinon, si vous aimez les solution tordues

(mais sans récursion ni table temporaire)

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT TOP(
	DATEDIFF(
		DAY,
		'20110701',
		'20110801'
	)
)
	DATEADD(
		DAY, 
		ROW_NUMBER() 
			OVER(ORDER BY object_id ), 
		'20110701'
	)
FROM sys.all_objects

EDIT : bien sur vous pouvez utiliser n'importe quelle table dont le nombre de ligne sera toujours superieure au nombre maximum de ligne pour votre requête, et trier sur un colonne indexée...
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h53.


 
 
 
 
Partenaires

Hébergement Web