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 :

Soustraire une valeur


Sujet :

Développement SQL Server

  1. #1
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut Soustraire une valeur
    Bonjour
    Je débute dans le sql et je recherche à faire la soustraction d'un nombre par rapport à 2 lignes. C'est à dire :

    J'ai une table du composé de colonne : Date - Valeur - Tag.
    J'ai rempli ma table de tels sorte :

    d1 - 112 - P1
    d1 - 100 - P2
    d2 - 150 - P1
    d2 - 185 - P2
    d3 - 115 - R1
    d3 - 500 - R34


    Je veux inserer
    d1 - (112-100) - P3
    d2 - (150-185) - P3

    Je sais le faire avec la fonction d'addition SUM :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select sum(valeur) from Mesure where Tag ='P1' or Tag ='P2' group by date
    mais pas pour la soustraction. Comment faut il faire?

    Merci
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Bonsoir,

    Une solution :

    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
    DECLARE @t TABLE
    (
     [date] DATETIME,
     valeur INT,
     tag CHAR(3)
    )
     
    INSERT INTO @t (date,valeur,tag) VALUES ('20090101',112,'P1');
    INSERT INTO @t (date,valeur,tag) VALUES ('20090101',100,'P2');
    INSERT INTO @t (date,valeur,tag) VALUES ('20090102',150,'P1');
    INSERT INTO @t (date,valeur,tag) VALUES ('20090102',185,'P2');
    INSERT INTO @t (date,valeur,tag) VALUES ('20090103',100,'R1');
    INSERT INTO @t (date,valeur,tag) VALUES ('20090103',500,'R34');
     
    WITH CTE_NUM_LINE
    AS
    (
    	SELECT 
    		ROW_NUMBER() OVER(PARTITION BY date ORDER BY date) AS num_op,
    		*  
    	FROM @t
    	WHERE tag IN ('P1','P2') 
    )
    SELECT 
    	[date],
    	SUM(CASE num_op WHEN 1 THEN valeur 
    		ELSE -1 * valeur 
    		END
    	) AS valeur,
    	'P3' AS tag
    FROM CTE_NUM_LINE
    GROUP BY [date]

    Une autre solution:
    Ajouter une colonne de signe d'opération si vous connaissez le signe d'opération affectant votre valeur à l'insertion. La requête dans ce cas est plus simple à écrire mais nécessite un changement de structure et d'alimentation de votre table.

    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
    DECLARE @t TABLE
    (
     [date] DATETIME,
     valeur INT,
     tag CHAR(3),
     signe CHAR(1)
    )
     
    INSERT INTO @t VALUES ('20090101',112,'P1','+');
    INSERT INTO @t VALUES ('20090101',100,'P2','-');
    INSERT INTO @t VALUES ('20090102',150,'P1','+');
    INSERT INTO @t VALUES ('20090102',185,'P2','-');
    INSERT INTO @t VALUES ('20090103',100,'R1','+');
    INSERT INTO @t VALUES ('20090103',500,'R34','-');
     
    SELECT 
    	[date],
    	SUM(CASE signe 
    			WHEN '+' THEN valeur
    			ELSE -1* valeur
    		END
    	) AS valeur,
    	'P3' AS tag
    FROM @t
    WHERE tag IN ('P1','P2')
    GROUP BY [date];
    ++


    ++

  3. #3
    Membre actif Avatar de Masmeta
    Homme Profil pro
    Ing. R&D informatique industrielle
    Inscrit en
    Mai 2006
    Messages
    472
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Ing. R&D informatique industrielle
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2006
    Messages : 472
    Points : 221
    Points
    221
    Par défaut
    Merci de votre réponse,

    Pendant le week end j'y ai pas mal réfléchie et je suis parti sur cette solution là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select date, valeur as P1 , Tag into #TP1 from mesure where tag like 'Nom1'
    select date, valeur as P2 , Tag into #TP2 from mesure where tag like 'Nom2'
    insert into MaTable (TagName, Date, Value, Traitement) select 'Nom3',#tp1.date,P1-P2, 'DIFF' from #tp1 inner join #tp2 on #tp1.date = #TP2.date order by #TP1.date
    drop table #TP1
    drop table #TP2
    Cela fonctionne cependant je ne sais pas si c'est très élégant de créer des tables temporaires comme cela.
    "Nulla Tenaci Invia Est Via"
    Aux persévérants aucune route n'est interdite

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 23/05/2012, 17h51
  2. soustraire une valeur sur une date
    Par MBAYE BABACAR GUEYE dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 29/07/2008, 16h30
  3. Retourner une valeur avec une fonction
    Par stephtbest dans le forum ASP
    Réponses: 4
    Dernier message: 31/10/2003, 16h37
  4. Prendre une valeur dans la grappe XML
    Par Sandrine75 dans le forum XMLRAD
    Réponses: 7
    Dernier message: 21/05/2003, 10h26
  5. Afficher une valeur du context
    Par [DreaMs] dans le forum XMLRAD
    Réponses: 13
    Dernier message: 28/04/2003, 13h49

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