Teradata - 无法嵌套聚合操作

时间:2015-02-24 22:45:08

标签: teradata

PROD_AMT我想得到的是当ACCT_NBR,PROD_NBR和PROD_AMT相同时,我只需要一个100(来自不同)的PROD_AMT,并且当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

1 个答案:

答案 0 :(得分:1)

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

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查询获得类似的结果,其中一个查询将在记录不同的情况下进行求和,而另一个查询将返回记录重复的不同prod_amt。

虽然上面的例子很好,如果你根据复杂的逻辑确实有不同的聚合需求,那么对于你的问题,有一种更简单的方法可以做同样的事情而不使用窗口函数:

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

如果你需要将它改编成一个复杂的语句,你可以将复杂的语句放在子查询中,其中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