实现此SQL查询的最简单方法是什么?

时间:2012-06-06 12:39:31

标签: sql sql-server

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

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

日期,关键,价值

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

如何实现此Excel功能?我最初这样做的方式我有两个连接(将值全部放在同一行的不同列中)但是这看起来有点矫枉过正,必须有一个更聪明的方法?

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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()函数,这些函数可以更容易创建。