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 :

Variable évoluant durant l'execution de la requete [2008]


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Par défaut Variable évoluant durant l'execution de la requete
    Bonjour à tous,

    Je cherche un moyen de faire évoluer une variable durant l'exécution d'une requête. Le problème est le suivant :

    J'ai une série de valeurs qui sont testées à chaque ligne par rapport à une valeur de référence (cible). Selon le résultat du test (vrai ou faux), la cible change. Les valeurs suivantes sont alors testées par rapport à cette nouvelle cible.

    Supposons que le test soit : "Si la valeur est supérieur de 10 % à la cible, alors la cible est augmentée de 2, sinon la cible reste identique".

    Je voudrais donc obtenir :

    valeur test cible
    20 faux 20
    21 faux 20
    19 faux 20
    28 vrai 22
    23 faux 22
    25 vrai 24

    J'essaie de passer par une variable au sein d'une fonction, mais évidemment, la cible est réinitialisée à chaque ligne. Je serais bien passé par une table et un UPDATE mais c'est interdit dans une fonction, bref, je sèche quant à la manière de stocker cette cible et l'utiliser quand j'en ai besoin....

    Auriez-vous une idée ?

    Merci d'avance !

  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 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Un horrible curseur avec un UPDATE ... WHERE CURENT OF ?

    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
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Fred !!! Est-ce qu'on s’inquiète maintenant, ou est-ce qu'on attend que tu fasses l'éloge de MySQL ?


    Blague à part, le besoin suggère une notion d'ordre, or il n'y en a pas dans le jeu d'essai fourni. n'y a-t-il pas une timestamp ou autre ?

    une solution à base de CTE récursive , j'ai ajouté une colonne Rang afin de faire le job, mais ça sera à remplacer par un ROW_NUMBER() sur le timestamp un fois l'ordre défini.

    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
     
    CREATE TABLE #T (
    		Rang		INT NOT NULL	
    	,	Valeur		DECIMAL(10,4) NOT NULL
    	,	Test		BIT NULL
    	,	Cible		DECIMAL(10,4) NULL
    )
    ;
     
    INSERT INTO #T (Rang,  Valeur) VALUES
     (1,	20 )	
    ,(2,	21 )	
    ,(3,	19 )	
    ,(4,	28 )	
    ,(5,	23 )	
    ,(6,	25 )	
    ;
     
     
    WITH CTE AS (
    	SELECT 
    			Rang
    		,	Valeur
    		,	CAST(0 AS BIT)	AS test
    		,	Valeur			AS Cible
    	FROM #T
    	WHERE Rang = 1
    	UNION ALL
    	SELECT 
    			T.Rang
    		,	T.Valeur
    		,	CAST(CASE WHEN T.Valeur > CTE.Cible * 1.10 THEN 1 ELSE 0 END AS BIT)
    		,	CAST(CTE.Cible + CASE WHEN T.Valeur > CTE.Cible * 1.10 THEN  2 ELSE 0 END AS DECIMAL(10,4))
    	FROM CTE
    	INNER JOIN #T AS T
    		ON T.Rang = CTE.Rang + 1
    )
    UPDATE T
    	SET	test = CTE.test
    	,	Cible = CTE.Cible
    FROM #T AS T
    INNER JOIN CTE
    	ON CTE.Rang = T.Rang
     
    SELECT *
    FROM #T
    ;
    DROP TABLE #T
    Rang	Valeur	Test	Cible
    1	20.0000	0	20.0000
    2	21.0000	0	20.0000
    3	19.0000	0	20.0000
    4	28.0000	1	22.0000
    5	23.0000	0	22.0000
    6	25.0000	1	24.0000
    

  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 010
    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 010
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Fred !!! Est-ce qu'on s’inquiète maintenant, ou est-ce qu'on attend que tu fasses l'éloge de MySQL ?
    1) c'est fait : https://www.developpez.net/forums/d1...e/#post9652128
    2) c'est pas beau de vieillir !!!

    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 averti
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Par défaut
    merci pour vos réponses. Problème résolu grâce à aieeeuuuuu !!

    @aieeeuuuuu : votre solution fonctionne parfaitement, j'ai pu l'adapter à mon problème qui était un peu plus compliqué que l'exemple. J'avais bien un champ pour ordonner tout ça

    Je ne connaissais pas cette méthode de CTE récursive, donc un grand merci !

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

Discussions similaires

  1. [MySQL] Log des requetes MySQL durant l'execution d'un script PHP
    Par cydream dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/05/2014, 17h01
  2. pb d'execution d'une requete sql
    Par pit9.76 dans le forum Bases de données
    Réponses: 2
    Dernier message: 26/06/2004, 12h03
  3. Probleme d'execution d'une requete avec un Count
    Par PrinceMaster77 dans le forum ASP
    Réponses: 4
    Dernier message: 23/06/2004, 10h33
  4. [ADO] Probleme lors de l'execution d'une requete...
    Par NoisetteProd dans le forum Bases de données
    Réponses: 4
    Dernier message: 04/06/2004, 12h43
  5. erreur "ORA-22905" lors de l'execution d'un requet
    Par benji999 dans le forum Administration
    Réponses: 26
    Dernier message: 14/04/2004, 11h47

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