Teradata - 无法嵌套聚合操作

Teradata - Cannot nest aggregate operations

我想得到的PROD_AMT是当ACCT_NBR、PROD_NBR和PROD_AMT相同时,我只需要一个PROD_AMT是 100(来自不同的),当 ACCT_NBR 相同但 PROD_NBR 不同时,那么我需要的 PROD_AMT 是 90 (30+60)

SELECT ACCT_NBR
,COUNT(DISTINCT CASE WHEN PROD_NBR = 1 THEN SUM(DISTINCT PROD_AMT)
                     WHEN PROD_NBR > 1 THEN SUM(PROD_AMT)
                END) AS AMT
FROM TABLE

ACCT_NBR PROD_NBR PROD_AMT
3007     001      30
3007     002      60
1000     003      100
1000     003      100

可能有几种方法可以解决这个问题。使用子查询来确定哪些记录应该求和,哪些记录应该不同,您可以使用:

SELECT
    acct_nbr,
    CASE WHEN sumflag = 'X' THEN SUM(prod_amt) ELSE MAX(prod_amt) END as amt
FROM
    (
        SELECT
            acct_nbr,
            prod_nbr,
            prod_amt,
            CASE WHEN COUNT(*) OVER (PARTITION BY Acct_nbr, prod_nbr, prod_amt) = 1 THEN 'X' ELSE NULL END AS sumflag
        FROM
            table
    )t1
GROUP BY acct_nbr, sumflag

我只是在这里使用 MAX(),因为这无关紧要...我们知道将与 max() 聚合的所有值都是重复的,所以这是一个洗礼。

您可以使用 UNION 查询获得类似的结果,其中一个查询会在记录不同的情况下进行求和,而另一个查询只会 return 不同 prod_amt记录重复。

虽然上面的例子很好,如果你真的有不同的聚合需求取决于复杂的逻辑,对于你的问题有一个更简单的方法来做同样的事情不使用 window 函数:

SELECT  
    acct_nbr,
    sum(prod_amt) AS amt
FROM
    (
        SELECT DISTINCT
            acct_nbr,   
            prod_amt
        FROM 
            table
    )t1
GROUP BY 1

如果您需要使它适应一个复杂的语句,您可以将您的复杂语句放入 as 子查询中,其中 table 在上面,例如:

SELECT  
    acct_nbr,
    sum(prod_amt) AS amt
FROM
    (
        SELECT DISTINCT
            acct_nbr,   
            prod_amt
        FROM 
            (
                YOUR REALLY COMPLEX QUERY GOES IN HERE
            )t2

    )t1
GROUP BY 1