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 :

Lecture de Variables Dinamique


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Par défaut Lecture de Variables Dinamique
    Salut a tous!

    J'ai un probleme avec une SP, car je necessite de lire 9 variable a fin de pouvoir effectué des calcules. Genre j'ai 9 variable de la manière suivante. @n1, @n2, ..., @n9 et a chaque variable il me faut faire ce calcule (@nX/@total) est vérifié se le résultat et >= 0,5. Si le résulta est >= 0,5 j'ai trouvé la bonne variable!

    Merci d'avance!

    Filipe

  2. #2
    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
    Dans votre requêtes faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ... CASE 
           WHEN @n1/@total >= 0.5 THEN @n1
           WHEN @n2/@total >= 0.5 THEN @n2
           ...
           WHEN @n9/@total >= 0.5 THEN @n9
        END
    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/ * * * * *

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Dans votre requêtes faites :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ... CASE 
           WHEN @n1/@total >= 0.5 THEN @n1
           WHEN @n2/@total >= 0.5 THEN @n2
           ...
           WHEN @n9/@total >= 0.5 THEN @n9
        END
    A +
    Merci SQLpro,

    voila maintenant il me faut que après le @n1 me calcule (@nX/@total)+(@nX-1/@total) >= 0.5. Comment faire, d'une manière dynamique et bien sur générique.

    Merci d'avance!

  4. #4
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Si votre procédure stockée ne fait que cette opération, alors vous devriez utiliser une fonction scalaire

    Je suppose que vous êtes sous SQL Server 2005.
    En utilisant une CTE récursive, vous pouvez écrire :

    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
    51
    52
    53
    CREATE PROCEDURE PsTOTO
    	@n1 FLOAT,
    	@n2 FLOAT,
    	@n3 FLOAT,
    	@n4 FLOAT,
    	@n5 FLOAT,
    	@n6 FLOAT,
    	@n7 FLOAT,
    	@n8 FLOAT,
    	@n9 FLOAT,
    	@total FLOAT
    AS
    BEGIN
    	WITH
    		-- Calcul des valeurs
    		DIV (val, ordre) AS
    		(
    				SELECT @n1 / @total, 1
    			UNION
    				SELECT @n2 / @total, 2
    			UNION
    				SELECT @n3 / @total, 3
    			UNION
    				SELECT @n4 / @total, 4
    			UNION
    				SELECT @n5 / @total, 5
    			UNION
    				SELECT @n5 / @total, 6
    			UNION
    				SELECT @n6 / @total, 7
    			UNION
    				SELECT @n7 / @total, 8
    			UNION
    				SELECT @n8 / @total, 9
    		),
    		-- Calcul des cumuls
    		CALC AS
    		(
    				SELECT val,
    						1 AS indice
    				FROM DIV
    				WHERE ordre = 1
    			UNION ALL
    				SELECT CALC.val + DIV.val,
    						indice + 1
    				FROM CALC
    				JOIN DIV ON DIV.ordre = CALC.indice + 1
    		)
    	-- Extraction de la plus petite valeur >= 0.5
    	SELECT TOP 1 val
    	FROM CALC
    	WHERE val >= 0.5
    END
    Exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC dbo.TOTO 1,2,3,4,5,6,7,8,9,10
    Retourne 0,6.

    Vous pouvez écrire la fonction comme suit :

    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
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    CREATE FUNCTION FnTOTO
    	(
    		@n1 FLOAT,
    		@n2 FLOAT,
    		@n3 FLOAT,
    		@n4 FLOAT,
    		@n5 FLOAT,
    		@n6 FLOAT,
    		@n7 FLOAT,
    		@n8 FLOAT,
    		@n9 FLOAT,
    		@total FLOAT
    	)
    RETURNS FLOAT
    AS
    BEGIN
    	DECLARE @result FLOAT
     
    	;WITH
    		-- Calcul des valeurs
    		DIV (val, ordre) AS
    		(
    				SELECT @n1 / @total, 1
    			UNION
    				SELECT @n2 / @total, 2
    			UNION
    				SELECT @n3 / @total, 3
    			UNION
    				SELECT @n4 / @total, 4
    			UNION
    				SELECT @n5 / @total, 5
    			UNION
    				SELECT @n5 / @total, 6
    			UNION
    				SELECT @n6 / @total, 7
    			UNION
    				SELECT @n7 / @total, 8
    			UNION
    				SELECT @n8 / @total, 9
    		),
    		-- Calcul des cumuls
    		CALC AS
    		(
    				SELECT val,
    						1 AS indice
    				FROM DIV
    				WHERE ordre = 1
    			UNION ALL
    				SELECT CALC.val + DIV.val,
    						indice + 1
    				FROM CALC
    				JOIN DIV ON DIV.ordre = CALC.indice + 1
    		)
    	-- Extraction de la plus petite valeur >= 0.5
    	SELECT TOP 1 @result = val
    	FROM CALC
    	WHERE val >= 0.5
     
    	RETURN @result
    END
    Exemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT dbo.FnTOTO(1,2,3,4,5,6,7,8,9,10)
    Retourne 0,6.

    Et vous pourriez écrire directement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    DECLARE @toto FLOAT
    SELECT @toto = dbo.FnTOTO(1,2,3,4,5,6,7,8,9,10)
    @++

  5. #5
    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
    Là Elsuket, je te trouve mauvais sur le coup. En effet ce sont des variables d'entrée d'une proc stock. Inutile donc de les trimbaler dans toutes les requêtes.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE @n FLOAT;
     
    SELECT @n =
       CASE 
           WHEN @n1/@total >= 0.5 THEN @n1
           WHEN @n2/@total >= 0.5 THEN @n2
           ...
           WHEN @n9/@total >= 0.5 THEN @n9
        END;
    ...
    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/ * * * * *

  6. #6
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Je ne comprends pas ta remarque, puisque olifile veut calculer le cumul des valeurs ...
    Sinon je n'aurai rien proposé

    @++

  7. #7
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2006
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Portugal

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2006
    Messages : 55
    Par défaut
    Salut a tous!

    Bon j'ai résolu mon problème avec la résolution de elsuket. en fait, je voulais calculé le cumul des valeurs. J'ai fait une petit adaptation au script de elsuket est le tour est joué!

    Merci elsuket!!!

    Je vous remercie a tous de m'avoir aidé!

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

Discussions similaires

  1. [JSTL] Lecture de variable impossible (bis)
    Par Mister Nono dans le forum Struts 1
    Réponses: 8
    Dernier message: 12/09/2007, 21h06
  2. Probleme de lecture de variable ${ma_variable}
    Par willoi dans le forum Spring
    Réponses: 3
    Dernier message: 06/08/2007, 15h07
  3. Problème de lecture de variable
    Par k.cheker dans le forum C
    Réponses: 15
    Dernier message: 29/03/2007, 17h23
  4. Awk et lecture de variables
    Par aicfr dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 04/12/2006, 19h05
  5. [FLASH MX] currentItem, prob lecture de variable
    Par totoche dans le forum Flash
    Réponses: 5
    Dernier message: 16/09/2005, 13h03

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