SQL:如何用条件(CASE WHEN??)聚合值



我的数据有3个变量,用户ID,交易金额和交易日期,我想为每个用户ID聚合2天的交易金额,但有条件。

条件是,例如,我想为ID 12345聚合8/31和8/30的交易金额,如果这个ID在8/31的交易金额为0,这意味着这个ID在8/31没有任何交易,那么就忽略这个用户ID,我不打算为这个用户ID聚合金额。

如果另一个ID 23456在8月31日有交易,而在8月30日没有交易,那么我将汇总该ID在8月31日的交易。

如果一个ID 34567在8月30日和8月31日都有交易,那么我将汇总8月30日和8月31日的交易。

我该怎么做?我整个下午都在挣扎。提前感谢任何建议和想法!

根据你的问题应该是

 select  user_id, sum(a.transaction_amount + b.transaction_amount).
 from my_table as a
 inner join  my_table as b on date_add(b.transaction_date, interval 1 day) =  a.transaction_date
 where date(a.transaction_date) =  STR_TO_DATE('31,8,2016','%d,%m,%Y')
 and a.transaction_amount > 0
 group by user_id
SELECT User_ID, SUM(Transaction_Amount)
FROM yourTable
WHERE DATE(Transaction_Date) = '2016-08-30'
  OR (DATE(Transaction_Date) = '2016-08-31' AND Transaction_Amount > 0)
GROUP BY User_ID

使用条件聚合:

select userid,
       sum(case when date = '2016-08-30' then amount else 0 end) as amt_20160830,
       sum(case when date = '2016-08-31' then amount else 0 end) as amt_20160831
from t
group by userid
having sum(case when date = '2016-08-31' then amount else 0 end) > 0;

代码的确切外观可能因数据库而异,但这是相当标准的SQL。

似乎您只想返回在8月31日有交易的用户:

select userid,
       sum(trans_amount)
from t
where trans_date between date '2016-08-30' and date '2016-08-31'
group by userid
having max(trans_date) = date '2016-08-31'

最新更新