Teradata CASE WHEN属性IN SELECT

时间:2013-06-17 08:23:30

标签: sql teradata

我在Teradata有两张桌子 - “a”和“ch”。表ch包含2个列“amt”和“code”。表“a”和“ch”之间是LEFT JOIN。加入,在SELECT部分​​我尝试SUM amt值。但是当“代码”属性具有特定值时,它只能占用“amt”值的70%。

这就是我的尝试:

SELECT SUM 
       (
       CASE WHEN ch.code IN (SELECT code from ...)
          then 0.7*ch.amt
       )   
       else ch.amt
       END
FROM a LEFT JOIN ch

我收到错误:

  

在CASE表达式的WHEN子句中非法表达。

Google说,这是因为CASE不允许SELECT语句。

有任何建议我如何实现上述功能?

3 个答案:

答案 0 :(得分:0)

一个简单的解决方案如下:

        SELECT SUM(
                    SELECT 0.7*amt AS amt 
                    FROM ch
                    WHERE ch.code = specific_value

                    UNION ALL 

                    SELECT amt from ch 
                    WHERE  ch.code <> specific_value
                  )
        FROM a LEFT JOIN ch 
        ON a.join_index = ch.join_index

如果您没有加入这两个表的索引,则需要使用两个 SELECT子查询与UNION运算符连接在一起。

答案 1 :(得分:0)

因为当我假设特定值来自另一个表/基于某些其他条件时,你试图在里面写一个查询。您可以尝试以下方法。

 SELECT 
      SUM(CASE WHEN MATCH = 1 THEN 0.7*AMT ELSE AMT END)
 FROM
      ( 
      SELECT AMT,CODE,
            CASE WHEN C.CODE IS NOT NULL THEN 1 ELSE 0 END AS MATCH
      FROM
      A LEFT OUTER JOIN CH
      ON JOIN_CONDITION
      LEFT OUTER JOIN 
      (SELECT CODE FROM ....) C
       ON CH.CODE=C.CODE) A

答案 2 :(得分:0)

从技术上讲,您可以在案例表达式中使用select,您必须为其设置样式:

select 
  (case when (select 'match' colM from (select 1 col1) s0 where s0.col1=s1.col1) is not null
    then '1'
    else '0'
  end) case_when_select_col
from (select '1' col1) s1  

在您的情况下:

  select case when 
    (select 1 from (select code from ...) s1 where ch.code=s1.code) is null
    then ch.amt
    else 0.7 * ch.amt
    end
  from a left join ch