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 13/12/2011, 10h08   #1
Membre à l'essai
 
Inscription : mai 2008
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 133
Points : 23
Points : 23
Par défaut Requête meilleures / moins bonnes valeurs

Bonjour,

J'ai deux tables : "Données" et "Structure"

Dans "Données", j'ai le nom, la valeur et la période (AAAA/MM).
Dans "Structure", j'ai le nom.

Je souhaite récupérer pour chaque période :
- le nom des trois structures qui ont la meilleure valeur
- le nom des trois structures qui ont la moins bonne valeur
- le nombre de structures qui ont une valeur

Merci par avance.
colonel.klink est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 13/12/2011, 12h01   #2
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 470
Points : 2 470
Envoyer un message via Yahoo à zinzineti
Bonjour,
Dans un premier temps commence déjà par nous montrer ce que tu as fait (ce que tu as écrit comme requête) et on va t'aider dans un second temps.
On ne va pas faire le travail à ta place mais on peut t'aider à le faire
on est sur un forum d'entraide.
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 09h10   #3
Membre à l'essai
 
Inscription : mai 2008
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 133
Points : 23
Points : 23
Bonjour,

J'ai finalement réussi à faire cette procédure stockée :
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
CREATE PROC [dbo].[RecupererCentres]
	(@PeriodeDeb varchar(7),@PeriodeFin varchar(7), @Ratio varchar(50))
AS
 
DECLARE @Tmp_Sortie TABLE (Periode varchar(7), Cen_B1 varchar(50), Cen_B2 varchar(50), Cen_B3 varchar(50), Cen_H1 varchar(50), Cen_H2 varchar(50), Cen_H3 varchar(50), NbCen int)
DECLARE @Tmp_Bas TABLE (NbRank smallint, Centre varchar(10), Per varchar(7))
DECLARE @Tmp_Haut TABLE (NbRank smallint, Centre varchar(10), Per varchar(7))
DECLARE @Tmp_NbCen TABLE (Per varchar(7), Tmp_NbCen int)
 
SET NOCOUNT ON
 
BEGIN
 
	INSERT INTO @Tmp_Sortie(Periode)
	SELECT DISTINCT RATIO.RAT_Periode AS Periode
	FROM RATIO
	WHERE (RATIO.RAT_Nom IN (@Ratio)) AND (RATIO.RAT_Periode BETWEEN @PeriodeDeb AND @PeriodeFin) 
 
	INSERT INTO @Tmp_Bas
	SELECT Rank_Bas, TAB_CEN_BAS.CEN_Code_FK AS CEN_Bas, RAT_Periode FROM	
	(   SELECT RATIO.CEN_Code_FK AS CEN_Code_FK, RANK() OVER(PARTITION BY RAT_Periode ORDER BY RATIO.RAT_Valeur ASC) AS Rank_Bas, RAT_Periode
		FROM RATIO	
		WHERE (RAT_Periode BETWEEN @PeriodeDeb AND @PeriodeFin) AND (RATIO.RAT_Nom IN (@Ratio))
	 ) AS TAB_CEN_BAS
	WHERE Rank_Bas <=3
 
	UPDATE @Tmp_Sortie SET Cen_B1 = Centre FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Bas AS Tmp_Bas ON Tmp_Sortie.Periode = Tmp_Bas.Per AND Tmp_Bas.NbRank = 1
	UPDATE @Tmp_Sortie SET Cen_B2 = Centre FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Bas AS Tmp_Bas ON Tmp_Sortie.Periode = Tmp_Bas.Per AND Tmp_Bas.NbRank = 2
	UPDATE @Tmp_Sortie SET Cen_B3 = Centre FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Bas AS Tmp_Bas ON Tmp_Sortie.Periode = Tmp_Bas.Per AND Tmp_Bas.NbRank = 3
 
	INSERT INTO @Tmp_Haut
	SELECT Rank_Haut, TAB_CEN_HAUT.CEN_Code_FK AS CEN_Haut, RAT_Periode FROM	
	(   SELECT RATIO.CEN_Code_FK AS CEN_Code_FK, RANK() OVER(PARTITION BY RAT_Periode ORDER BY RATIO.RAT_Valeur DESC) AS Rank_Haut, RAT_Periode
		FROM RATIO	
		WHERE (RAT_Periode BETWEEN @PeriodeDeb AND @PeriodeFin) AND (RATIO.RAT_Nom IN (@Ratio))
	 ) AS TAB_CEN_HAUT
	WHERE Rank_Haut <=3
 
	UPDATE @Tmp_Sortie SET Cen_H1 = CENTRE FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Haut AS Tmp_Haut ON Tmp_Sortie.Periode = Tmp_Haut.Per AND Tmp_Haut.NbRank = 1
	UPDATE @Tmp_Sortie SET Cen_H2 = CENTRE FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Haut AS Tmp_Haut ON Tmp_Sortie.Periode = Tmp_Haut.Per AND Tmp_Haut.NbRank = 2
	UPDATE @Tmp_Sortie SET Cen_H3 = CENTRE FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_Haut AS Tmp_Haut ON Tmp_Sortie.Periode = Tmp_Haut.Per AND Tmp_Haut.NbRank = 3
 
	INSERT INTO @Tmp_NbCen
	SELECT DISTINCT RATIO.RAT_Periode AS Periode, COUNT(RATIO.CEN_Code_FK) AS Tmp_NbCen
	FROM RATIO
	WHERE (RATIO.RAT_Nom IN (@Ratio)) 
	GROUP BY RATIO.RAT_Periode 
 
	UPDATE @Tmp_Sortie SET NbCen = Tmp_NbCen FROM @Tmp_Sortie AS Tmp_Sortie INNER JOIN @Tmp_NbCen AS Tmp_NbCen ON Tmp_Sortie.Periode = Tmp_NbCen.Per
END
Par contre, je dois créer une procédure permettant de fusionner le résultat de deux autres mais ne trouve pas la bonne syntaxe.

Actuellement, j'ai :
Code :
1
2
3
4
5
6
7
8
9
BEGIN
	SET NOCOUNT ON;
		INSERT INTO @Tmp_Moy EXEC [dbo].[Test] @PeriodeDeb, @PeriodeFin, @Centre, @Ratio;   
		INSERT INTO @Tmp_Cen EXEC [dbo].[RecupererCentre] @PeriodeDeb, @PeriodeFin, @Ratio;
 
	SELECT *
	FROM @Tmp_Moy AS Tmp_Moy INNER JOIN @Tmp_Cen AS Tmp_Cen ON Tmp_Moy.Periode = Tmp_Cen.Periode	
 
END
Merci pour votre aide.
colonel.klink est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 10h36   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
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 959
Points : 17 791
Points : 17 791
Quelle horrreur cette procédure alors qu'une simple requêtes avec des fonctions de fenêtrage fera l'affaire et mille fois plus vite !

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
WITH T AS
(SELECT d.Nom, Periode,
        RANK() OVER(PARTITION BY s.nom ORDER BY MAX(Valeur) DESC) AS MX,
        RANK() OVER(PARTITION BY s.nom ORDER BY MAX(Valeur) ASC) AS MI,
        COUNT(s.nom) AS NOMBRE
 FROM   Données AS d
        LEFT OUTER JOIN Structure AS S
             ON d.Nom = S.Nom
 GROUP  BY d.Nom, Periode)
SELECT Nom, Periode, 
       CASE WHEN MX <= 3 AND MI <3 THEN 'MEILLEURE et MOINS BONNE'
            WHEN MX <= 3 THEN 'MEILLEURE et MOINS BONNE'
            WHEN MI <3 THEN 'MOINS BONNE'
       END AS EXTREMES,
       NOMBRE
FROM   T
WHERE  MX <= 3 OR MI <= 3
A lire sur les fonctions de fenêtrage : http://sqlpro.developpez.com/article...clause-window/

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 14/12/2011, 11h08   #5
Membre à l'essai
 
Inscription : mai 2008
Messages : 133
Détails du profil
Informations forums :
Inscription : mai 2008
Messages : 133
Points : 23
Points : 23
Merci
colonel.klink 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 03h19.


 
 
 
 
Partenaires

Hébergement Web