我有以下示例数据:
Create Table #temp
(
Value1 decimal(8,2) NULL,
Value2 decimal(8,2) NULL,
Value3 decimal(8,2)
)
insert into #temp
(
Value1,
Value2,
Value3
)
select
-10,
NULL,
-10
union all
select
NULL,
5,
5
union all
select
-5,
NULL,
-0.71
union all
select
NULL,
5,
8
我需要做的是
当(COALESCE(Value1,Value2)和Value3为负数时,“比较”的结果必须为正数。
当(COALESCE(Value1,Value2)和Value3为正数时,比较结果必须为负数。
我正在查看SIGN函数,并具有以下查询:
select
*,
CASE WHEN SIGN((COALESCE(Value1,Value2) - Value3)) = -1 THEN
ABS((COALESCE(Value1,Value2) - Value3))
WHEN SIGN((COALESCE(Value1,Value2) - Value3)) = 1 Then
ABS((COALESCE(Value1,Value2) - Value3)) * -1
END
as Comparison
from #temp
我不能工作的原因是为什么第4行不是负数(应该是-3而不是+3)?我在用上面的方法做什么,还有更好的方法吗?
答案 0 :(得分:1)
我不确定我是否理解这个问题。
描述需求的方式适合您所获得的结果-所以我认为您对需求的描述可能是错误的。
我认为当If WorksheetExists("Sheet1") Then …
'or to test for a worksheet in a different workbook
If WorksheetExists("Sheet1", Workbooks("OtherWorkbook.xlsx")) Then
的绝对值小于value3
和value1
的绝对值的第一个非空值,以及value2
时,您可能想要相反的符号相等。那会得到我认为是您期望的结果。
基于该假设,我提出了以下查询:
null
结果:
select *,
NULLIF(ABS(COALESCE(Value1,Value2)) - ABS(Value3), 0) As [Is this what you want?],
NULLIF((ABS(COALESCE(Value1,Value2)) - ABS(Value3)) *
SIGN(ABS(COALESCE(Value1,Value2)) - ABS(Value3)), 0) As [A simplified version of current code]
from #temp
答案 1 :(得分:0)
您正在使其变得复杂,如果我理解您的正确答案,您可以使用一个简单的案例和像这样的isull来实现
但是,根据您的解释,第3行和第4行均应为正数
case when (isnull(value1, value2) - value3) = 0 then
null
else
-(isnull(value1, value2) - value3)
end as Comparison
这将返回
Value1 Value2 Value3 Comparison
------ ------ ------ -------
-10,00 null -10 ,00 null null because -10 minus -10 = 0
null 5,00 5,00 null null because 5 minus 5 = 0
-5,00 null -0,71 4,29 positive because -5 minus -0.71 is negative
null 5,00 8,00 3,00 positive because 5 minus 8 is negative
在我的结果中,第4行的值保持为正,这是因为根据您的解释,当value2-value3为负时,它必须为正
如果我再添加一个测试行,其值为(null,8,5),那么它将显示为-3,因为8-5为正数
Value1 Value2 Value3 Comparison
------ ------ ------ -------
-10 null -10 null
null 5,00 5,00 null
-5,00 null -0,71 4,29
null 5,00 8,00 3,00
null 8,00 5,00 -3,00 negative because 8 minus 5 is positive
编辑
我根据你的解释回答了。
看来您想要的是图片中的结果,而不是您的解释。
如果是这种情况(请调整您的问题的解释),您可以保留逻辑,但使用这样的abs值
case when (isnull(value1, value2) - value3) = 0 then
null
else
(abs(isnull(value1, value2)) - abs(Value3))
end as Comparison
现在它将返回此
Value1 Value2 Value3 Comparison
------ ------ ------ ----------
-10,00 null -10,00 null
null 5,00 5,00 null
-5,00 null -0,71 4,29
null 5,00 8,00 -3,00
null 8,00 5,00 3,00