多条件计算列

时间:2019-08-07 18:57:48

标签: sql sql-server

我正在尝试找出最合适的方法:

If C="WORD":

     A = 51 if B is between 0 and 2000
     A = 102 if B is between 2001 and 8000
     A = 204 if B is higher than 8000
     AND if D is ticked (checkbox) the A value turns into half`

我需要将此列“保留”,以便可以在报告中使用它。

对于其他专栏文章,我已经使用了它并且可以工作:

ALTER TABLE dbo.mytable 
    ADD C AS (A + B) / CASE D WHEN 1 THEN 4 ELSE 2 END;

从其他代码开始,但是它不起作用,并且仍然没有复选框的条件。

ALTER TABLE dbo.tablename
    ADD FieldA AS (CASE 
                      WHEN FieldC = "Word"  
                         THEN
                            CASE 
                               WHEN FieldB > 0 AND FieldB < =2000 
                                  THEN 102
                               WHEN FieldB > 2000 AND FieldB <= 8000 
                                  THEN 204
                               WHEN FieldB > 8000 
                                  THEN 306
                               ELSE NULL         
                            END,

任何人都可以发光吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

您的尝试“无效”,因为您有两个CASE表达式和只有一个END。每个END需要一个CASE

答案 1 :(得分:0)

希望这会起作用:

        ALTER TABLE dbo.tablename
        ADD FieldA AS (CASE   WHEN FieldC = "Word" and (FieldB>0 AND FieldB<=2000) THEN 51
                              WHEN FieldC = "Word" and (FieldB>2000 AND FieldB<=8000) THEN 102
                              WHEN FieldC = "Word" and (FieldB>8000 ) THEN 204
                         ELSE NULL         
                         END    
                        )

答案 2 :(得分:0)

从短期来看,Tab对您的错字是正确的。

从更大的角度看,您可以利用CASE条件按顺序求值这一事实,从而节省一些CPU时间,因此,如果倒退,则只需求值最后一个参数。另外,通过使用POWER技巧,您可以避免division by 0错误,而不必引入另一个CASE表达式。

如果FieldD有点,则包括在内。

FieldA的值在您的问题陈述和代码之间有所不同。我使用了问题陈述。如果需要,请更改。

ALTER TABLE dbo.tablename
ADD FieldA AS 
  (
    CASE 
      WHEN FieldC = "Word" THEN
        CASE 
          WHEN FieldB > 8000 
            THEN 204
          WHEN FieldB > 2000
            THEN 102
          WHEN FieldB >= 0 
            THEN 51
          ELSE NULL
        END
    END
    / POWER(2,FieldD) --<--- Or, possibly, POWER(2,CAST(FieldD AS tinyint))
   )