我在Teradata的2个表 - “a”和“通道”。表CH包含2个colums “AMT” 和 “密码”。表之间的“A”和“通道”是LEFT JOIN。加入制成,并在SELECT部分我想总结AMT值。但是,当一个“代码”属性有一个上特有的价值观是要道上只拿70%的“AMT”的价值。
这是我曾尝试:
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表达式时第非法的表达。
谷歌表示,这是因为CASE
不允许SELECT
语句。
任何建议我如何能实现上述功能?
一个简单的解决方案是如下:
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子查询。
既然你正试图写里面查询时我假设/的具体数值是从另一台基于一些其他条件。你可以尝试以下。
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