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 :

Requête meilleures / moins bonnes valeurs


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    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.

  2. #2
    Membre Expert

    Homme Profil pro
    Chargé de Développement et d'Analyse de données
    Inscrit en
    Mars 2010
    Messages
    1 278
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chargé de Développement et d'Analyse de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 278
    Par défaut
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    Bonjour,

    J'ai finalement réussi à faire cette procédure stockée :
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 002
    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 : 22 002
    Billets dans le blog
    6
    Par défaut
    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 : 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
    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
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    136
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 136
    Par défaut
    Merci

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

Discussions similaires

  1. Requête SQL : récupérer la valeur max
    Par Rodie dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/07/2006, 11h28
  2. [SQL] Problème requête sql,rajouter une valeur,checbox
    Par snakejl dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 23/06/2006, 11h18
  3. pb affichage de la bonne valeur
    Par moonia dans le forum Langage
    Réponses: 5
    Dernier message: 02/06/2006, 15h19
  4. Requête SQL la bonne syntaxe ?
    Par LhIaScZkTer dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/12/2005, 16h32
  5. Rnd qui ne donne pas que des bonnes valeurs
    Par kubito dans le forum Access
    Réponses: 2
    Dernier message: 08/10/2004, 18h00

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