【问题标题】:Teradata CASE WHEN attribute IN SELECTTeradata CASE WHEN 属性 IN SELECT
【发布时间】:2013-06-13 03:40:04
【问题描述】:

我在 Teradata 中有 2 个表 - “a”和“ch”。表 ch 包含 2 列“amt”和“code”。表“a”和“ch”之间是 LEFT JOIN。加入,在 SELECT 部分我试图对 amt 值求和。但是当一个“code”属性有一个特定的值时,它必须只取“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 语句。

有什么建议可以实现上述功能吗?

【问题讨论】:

    标签: sql teradata


    【解决方案1】:

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

            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 运算符连接在一起。

    【讨论】:

      【解决方案2】:

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

       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
      

      【讨论】:

        【解决方案3】:

        从技术上讲,您可以在 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
        

        【讨论】:

          猜你喜欢
          • 2017-02-28
          • 2019-03-31
          • 2020-09-13
          • 2021-03-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-09-17
          • 2011-08-27
          相关资源
          最近更新 更多