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

MS SQL Server Discussion :

Requete select pour faire un Update


Sujet :

MS SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut Requete select pour faire un Update
    bonjour

    Je souhaite faire une requete select :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select refgain,gain from gain WHERE  dtdate between '01/09/2009' and '30/09/2009' and V=1

    et ensuite traiter chaque ligne (de la requete select) par un update
    le but etant :

    1)de faire passer la valeur du champs gain (requete Select) vers le champ gainvalid (requete update)

    2) de calculer 30% de la valeur du champs gain (requete Select) vers le champ GainAdiGaming (requete update)

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE [Gain]   SET GainAdiGaming= ((gain *30) /100),gain=0,gainvalid=gain ,V=0,VValid= 1,[AnnVali] = 1,[AnnValiDt] = GETDATE WHERE  refgain=refgain

    Merci de votre aide

  2. #2
    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 : 42
    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
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Si vous êtes sous SQL Server 2005 ou 2008, vous pouvez utiliser une expression de table commune, introduite par WITH :

    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
    ;WITH
    	CTE_GAINS_SEPTEMBRE AS
    	(
    		SELECT refgain, gain
    		FROM dbo.gain
    		WHERE dtdate BETWEEN '01/09/2009' AND '30/09/2009'
    		AND V = 1
    	)
    UPDATE dbo.Gain
    SET gain = 0,
    	gainvalid = gain,
    	V = 0,
    	VValid = 1,
    	AnnVali = 1,
    	AnnValiDt = GETDATE()
    FROM dbo.Gain AS G
    JOIN CTE_GAINS_SEPTEMBRE AS C
    	ON G.refgain = C.refgain
    Habituez-vous :
    - A indenter votre code : il n'en sera que plus lisible
    - A qualifier le nom des objets que vous spécifiez (tables, fonctions, procédures stockées) par le nom du schéma auquel ils appartiennent : cela évite au moteur de base de données de devoir comparer le propriétaire de l'objet avec l'utilisateur qui exécute la requête
    - A utiliser des dates au format ISO : ce format est reconnu par la plupart des autres langages (YYYYMMDD) et est surtout international : si vous portez votre application sur une installation d'une instance anglaise de SQL Server, celle-ci ne fonctionnerait pas

    On peut étendre le bout de code que je vous propose en écrivant une 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
    CREATE PROCEDURE Ps_UpdateGains
    AS
    BEGIN
    	DECLARE @dateDeb DATETIME,
    			@dateFin DATETIME
     
    	-- le format 120 dans la fonction CONVERT est le format ISO des dates : YYYYMMDD
    	-- son transtypage en type DATETIME aboutit à une valeur de date dont l'heure est nulle (YYYYMMDD 00:00:00)
    	-- pour trouver la date de début du mois, on enlève à la date courante le n° du jour courant à la date courante et on ajoute 1
    	SELECT @dateDeb = DATEADD(day, -DAY(GETDATE()) + 1, CAST(CONVERT(CHAR(10), GETDATE(), 120) AS DATETIME)),
    			@dateFin = DATEADD(month, 1, @dateDeb)
     
    	-- Recherche des gains du mois en cours
    	WITH
    		CTE_GAINS_MOIS AS
    		(
    			SELECT refgain, gain
    			FROM dbo.gain
    			WHERE dtdate BETWEEN @dateDeb AND @dateFin
    			AND V = 1
    		)
    	UPDATE dbo.Gain
    	SET gain = 0,
    		gainvalid = gain,
    		V = 0,
    		VValid = 1,
    		AnnVali = 1,
    		AnnValiDt = GETDATE()
    	FROM dbo.Gain AS G
    	JOIN CTE_GAINS_MOIS AS C
    		ON G.refgain = C.refgain
    END
    Vous pouvez donc l'exécuter à n'importe quel moment dans le mois pour qu'elle effectue votre mise à jour.

    @++

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2009
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 9
    Points : 8
    Points
    8
    Par défaut
    Franchement respect

    elsuket tu es execeptionnel

    Merci Encore @+

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

Discussions similaires

  1. Utiliser UPDATE + SELECT pour faire un cache FIFO
    Par WeeJay dans le forum Langage SQL
    Réponses: 5
    Dernier message: 19/05/2008, 12h10
  2. requete sql pour faire un classement
    Par beezee dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/03/2006, 13h03
  3. critere de selection pr faire un UPDATE sur 1 table
    Par maxizoo dans le forum Langage SQL
    Réponses: 6
    Dernier message: 05/01/2006, 15h35
  4. utilisation de select() pour faire un Tchat
    Par innosang dans le forum Réseau
    Réponses: 30
    Dernier message: 09/11/2005, 16h15
  5. Requete select pour récupérer les no match entre 2 tables
    Par Celina dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/12/2003, 11h59

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