2

我有一个excel函数:=Max(0, -Min(A1-B1, C1-B1))

和 A1,B1,C1 是表中的 Value 列:

日期、键、值

现在假设日期无关紧要,A1,B1,C1 的密钥是 A,B,C

如何实现这个excel函数?我最初这样做的方式是我有两个连接(在同一行的不同列中获取所有值),但这似乎有点矫枉过正,必须有更聪明的方法吗?

4

2 回答 2

2

您可能可以将其减少为一个连接,因为您只需要B以下A部分:

select  case 
        when min(Value - isnull(yt2.Value,0)) > 0 then 0
        else -min(Value - isnull(yt2.Value,0))
        end
from    YourTable yt1
join    YourTable yt2
on      yt1.Key = 'A' and yt2.key = 'B'
        or
        yt1.Key = 'B' and yt2.key = 'C'
于 2012-06-06T12:46:01.317 回答
1

您的问题是为每一行建议一个单独的值。如果是这样,那么这是查询:

select t.*
       (case when -leastval < 0 then 0
             else -lesatval
        end) as TheValue
    end
from (select t.*,
             (case when A1 - B1 < C1 and A1 - B2 < B1 then A1 - B1
                   when C1 < B1 then C1
                   else B1
              end) as leastval
      from table t
     ) t

现在我正确地阅读了这个问题,让我假设每个日期都有一个 A、B 和 C 值。然后你可以使用上面的变体,首先简单地对数据进行去特征化:

select t.*
       (case when -leastval < 0 then 0
             else -leastval 
        end) as TheValue
    end
from (select t.*,
             (case when A - B < C and A - B < B then A - B
                   when C < B then C
                   else B
              end) as leastval
      from (select date, 
                   min(case when key = 'A' then value end) as A,
                   min(case when key = 'B' then value end) as B,
                   min(case when key = 'C' then value end) as C
            from table t
            group by date
           ) t
     ) t

还有其他方法来制定这一点。我试图合理地接近 Excel 公式。

顺便说一句,其他一些数据库提供 Greatest() 和 Least() 函数,这样的公式可能更容易创建。

于 2012-06-06T13:03:05.220 回答