1

我在 Teradata 中有 2 个表 - “a”和“ch”。表 ch 包含 2 列“amt”和“code”。表“a”和“ch”之间是 LEFT JOIN。加入,在 SELECT 部分我试图对 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 子句中的非法表达式。

谷歌说,那是因为CASE不允许SELECT陈述。

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

4

3 回答 3

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

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

于 2015-04-07T13:04:42.777 回答
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
于 2016-01-23T19:28:20.510 回答
0

从技术上讲,您可以在 case 表达式中使用 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
于 2019-12-09T23:57:53.123 回答