2010-04-09 9 views
4

Je voudrais soustraire une valeur d'une autre valeur. Le schéma de la table est comme suit:Comment soustraire des valeurs de deux instructions select

tag, datetime,value 
    ------------ 
    tag1, 2010-1-1 10:10:00, 123 
    tag2, 2010-2-2 10:12:00. 321 

    select * from 

    ((Select Max(Value) as [Value1] from History WHERE Datetime ='2010-1-1 10:10'  and tagname ='tag1') as v1 - 

    ( (Select Max(Value) as [Value2] from History WHERE Datetime ='2010-1-1 10:12'  and Tagname ='tag2') as v2)) 

évidemment je suis perdu ... comment je fais ceci.

grâce

ms-sql

+0

Y at-il toujours que deux dossiers? Si non, comment décidez-vous quels deux enregistrements sont soustraits l'un de l'autre? C'est à dire. Quels critères concernent les enregistrements qui vous incitent à effectuer la soustraction. Je voudrais utiliser cela pour effectuer une auto-adhésion, vous pouvez soustraire l'un de l'autre. – AaronLS

+0

est en fait son dernier enregistrement et un enregistrement de 10 dans le passé juste pour obtenir une indication du taux de changement – fishhead

Répondre

8

guess Total:

select v1.Value1 - v2.Value2 from 

    (Select Max(Value) as [Value1] from History WHERE Datetime ='2010-1-1 10:10' and tagname ='tag1') as v1 

CROSS JOIN 

    ( (Select Max(Value) as [Value2] from History WHERE Datetime ='2010-1-1 10:12'  and Tagname ='tag2') as v2) 
+0

S'il n'y a qu'une seule valeur dans chaque requête, alors cela fonctionnerait parfaitement. – SqlRyan

+0

Est-ce que Max (Value) fonctionnerait sans un groupe de sur Value? – AaronLS

+2

@AaronLS Oui, vous n'avez besoin que de GROUP BY sur les champs que vous n'utilisez pas dans une instruction aggregate. –

1

Avez-vous vraiment besoin d'emballage instruction select?

Vous pouvez déclarer deux variables @value1 et @value2 et les sous-traiter.

declare @value1 int, @value2 int 

select @value1 = Max(Value) as [Value1] from History WHERE Datetime ='2010-1-1 10:10'  and tagname ='tag1' 

select @value2 = Max(Value) as [Value2] from History WHERE Datetime ='2010-1-1 10:12'  and Tagname ='tag2' 

select @value1 - @value2 
+0

Merci pour ça ... J'avais essayé cette stratégie, mais je n'étais pas capable de l'obtenir ... Je vois l'erreur de mes manières maintenant. – fishhead

0

Quel est le type de la colonne de valeur? Si elle est déjà un entier le faire:

SELECT 

    (Select Max(Value) as [Value1] from History WHERE Datetime ='2010-1-1 10:10'  and tagname ='tag1') as v1 - 

    (Select Max(Value) as [Value2] from History WHERE Datetime ='2010-1-1 10:12'  and Tagname ='tag2') as v2 

sinon vous devrez le jeter comme un entier ou quel que soit le type numérique que vous voulez

0
select h1.value - h2.value 
from History h1 
inner join History h2 on h1.Datetime = '2010-1-1 10:10' and Datetime ='2010-1-1 10:12' 
Questions connexes