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
我想得到的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