带案例的 SQL GroupBy

问题描述 投票:0回答:1

我对 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' 时,我想再选择三列,我分别设置它们,有没有办法将它们设置在一起?

sql amazon-athena
1个回答
0
投票

我认为您在单个查询中尝试执行的操作没有意义。我从未见过像您尝试做的那样对案例进行条件分组,更不用说添加更多列了。

我建议将其分成两个不同的查询。然后,您甚至可以为具有较少列的查询使用空值来均衡缺少的列,并在两个结果之间执行 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
© www.soinside.com 2019 - 2024. All rights reserved.