【问题标题】:Teradata - Cannot nest aggregate operationsTeradata - 无法嵌套聚合操作
【发布时间】:2015-02-25 21:39:38
【问题描述】:

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

【问题讨论】:

  • 如果prod_nbracct_nbr 为1,您是否想对amt 求和,并且您想在事件中获得不同的prod_amt acct_nbr 不包含prod_nbr 的记录。正如所写,您在寻找什么并不是很清楚。

标签: teradata


【解决方案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

【讨论】:

  • sumflag 是一列吗?我的表中没有此列。
  • 它是使用窗口公式COUNT(*) OVER (PARTITION BY Acct_nbr, prod_nbr, prod_amt) 计算的派生列,它将按acct_nbrprod_nbrprod_amt 将记录分组在一起,并计算找到的数量。 . 然后寻找只有一条记录的组。如果它是一个只有一条记录的组,那么它会得到一个“X”
  • 我无法让它正常工作,因为我的真实查询与其他表有一些左连接。有没有办法只在选择中使用 CASE 来获得我需要的 prod_amt 100 和 90?
  • 我刚刚添加了一种更简单的方法来获取您的结果。它仍然需要一个子查询,但我添加了一个示例,您可以在其中滑入现有的 SQL 语句以使其更易于实现。我认为您无法使用子查询来实现这一点,因为您需要在同一字段上同时执行 DISTINCT/GROUP BY 和聚合。此外,如果您尝试将 Window Functio 向上移动到主查询中,则必须对所有字段进行 GROUP BY,这会让您回到第一方。
  • 我按照你的建议使用了子查询,所以它可以工作,我得到了结果。非常感谢!
猜你喜欢
  • 2014-06-25
  • 2020-05-15
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 2019-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多