使用SIGN功能,但无法转换为负数

时间:2019-07-18 06:12:21

标签: sql sql-server tsql

我有以下示例数据:

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)?我在用上面的方法做什么,还有更好的方法吗?

enter image description here

2 个答案:

答案 0 :(得分:1)

我不确定我是否理解这个问题。
描述需求的方式适合您所获得的结果-所以我认为您对需求的描述可能是错误的。
我认为当If WorksheetExists("Sheet1") Then … 'or to test for a worksheet in a different workbook If WorksheetExists("Sheet1", Workbooks("OtherWorkbook.xlsx")) Then 的绝对值小于value3value1的绝对值的第一个非空值,以及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