我对 SQL 还很陌生,我正在尝试根据条件编写一个对 groupBy 的查询。 我想要的是 -> 对于市场 CA 和 MX,总金额基于 MARKETPLACE 和 TRANSACTION_TYPE(代码始终相同) -> 对于市场 BR,根据 MARKETPLACE & TRANSACTION_TYPE & CONSUMPTION_TYPE 计算金额和本地金额的总和
但它给了我例外:服务:AmazonAthena;状态代码:400;错误代码:当我运行以下查询时出现 InvalidRequestException。
SELECT
CASE rae.TRANSACTION_MARKETPLACE_ID
WHEN '123456' THEN 'CA'
WHEN '234567' THEN 'MX'
WHEN '345678' THEN 'BR'
END as MARKETPLACE,
TRANSACTION_TYPE, SUM(AMOUNT) as AMOUNT, CODE,
IF (TRANSACTION_MARKETPLACE_ID = '345678',
SUM(rae.LOCAL_AMOUNT)
) as LOCAL_AMOUNT,
IF (
rae.TRANSACTION_MARKETPLACE_ID = '345678',
LOCAL_CODE
) as LOCAL_CODE,
IF (
rae.TRANSACTION_MARKETPLACE_ID = '345678',
CONSUMPTION_TYPE
) as CONSUMPTION_TYPE
FROM xxxTable as rae
WHERE MODEL = 'MODEL_1'
AND TRANSACTION_MARKETPLACE_ID IN ('123456', '234567', '345678')
AND (TRANSACTION_TYPE = 'TYPE_1' OR TRANSACTION_TYPE = 'TYPE_2' OR (TRANSACTION_TYPE = 'TYPE_3' AND ALLOW_CLAWBACK = TRUE))
AND TRANSACTION_DATE BETWEEN timestamp '2023-09-01' AND timestamp '2023-09-30'
GROUP BY (CASE WHEN MARKETPLACE = 'BR'
THEN TRANSACTION_MARKETPLACE_ID, TRANSACTION_TYPE, CODE, LOCAL_CODE, CONSUMPTION_TYPE END),
(CASE WHEN MARKETPLACE IN ('BR', 'CA') THEN TRANSACTION_MARKETPLACE_ID, TRANSACTION_TYPE, CODE END);
预期输出会喜欢
市场 | 交易类型 | 金额 | 代码 | 消费类型 | LOCAL_AMOUNT | 本地代码 |
---|---|---|---|---|---|---|
CA | TYPE_1 | xxx | 美元 | |||
MX | TYPE_1 | xxx | 美元 | |||
CA | TYPE_2 | xxx | 美元 | |||
MX | TYPE_2 | xxx | 美元 | |||
BR | TYPE_1 | xxx | 美元 | CON_TYPE_1 | xxx | 美元 |
BR | TYPE_1 | xxx | 美元 | CON_TYPE_2 | xxx | 美元 |
BR | TYPE_2 | xxx | 美元 | CON_TYPE_1 | xxx | 美元 |
BR | TYPE_2 | xxx | 美元 | CON_TYPE_2 | xxx | 美元 |
在 groupby 中添加案例后,它开始出现异常。谁能给出一些想法为什么?或者分成两个查询会更好吗? 另外,当 TRANSACTION_MARKETPLACE_ID = '345678' 时,我想再选择三列,我分别设置它们,有没有办法将它们设置在一起?
我认为您在单个查询中尝试执行的操作没有意义。我从未见过像您尝试做的那样对案例进行条件分组,更不用说添加更多列了。
我建议将其分成两个不同的查询。然后,您甚至可以为具有较少列的查询使用空值来均衡缺少的列,并在两个结果之间执行 UNION。比如:
SELECT
CASE rae.TRANSACTION_MARKETPLACE_ID
WHEN '123456' THEN 'CA'
WHEN '234567' THEN 'MX'
END as MARKETPLACE,
TRANSACTION_TYPE, SUM(AMOUNT) as AMOUNT, CODE,
0 as LOCAL_AMOUNT, '' as LOCAL_CODE, '' as CONSUMPTION_TYPE
from rae as rae
WHERE MODEL = 'MODEL_1'
AND TRANSACTION_MARKETPLACE_ID IN ('123456', '234567')
AND (TRANSACTION_TYPE = 'TYPE_1' OR TRANSACTION_TYPE = 'TYPE_2' OR (TRANSACTION_TYPE = 'TYPE_3' AND ALLOW_CLAWBACK = TRUE))
AND TRANSACTION_DATE BETWEEN timestamp '2023-09-01' AND timestamp '2023-09-30'
GROUP BY TRANSACTION_MARKETPLACE_ID, TRANSACTION_TYPE, CODE
UNION
SELECT
'BR' as MARKETPLACE,
TRANSACTION_TYPE, SUM(AMOUNT) as AMOUNT, CODE,
SUM(rae.LOCAL_AMOUNT) as LOCAL_AMOUNT,LOCAL_CODE, CONSUMPTION_TYPE
from rae as rae
WHERE MODEL = 'MODEL_1'
AND TRANSACTION_MARKETPLACE_ID ='345678'
AND (TRANSACTION_TYPE = 'TYPE_1' OR TRANSACTION_TYPE = 'TYPE_2' OR (TRANSACTION_TYPE = 'TYPE_3' AND ALLOW_CLAWBACK = TRUE))
AND TRANSACTION_DATE BETWEEN timestamp '2023-09-01' AND timestamp '2023-09-30'
GROUP BY TRANSACTION_MARKETPLACE_ID, TRANSACTION_TYPE, CODE, LOCAL_CODE, CONSUMPTION_TYPE