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
答案 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