我在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
语句。
有任何建议我如何实现上述功能?
答案 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