2016-09-25 86 views
0

我的数据有3个变量,用户ID,交易金额和交易日期, 我想为每个用户ID汇总2天的交易金额,但是条件。SQL:如何在条件下汇总价值(CASE WHEN ???)

例如,如果交易金额为8/31的这个ID,那么我想为ID 12345汇总8/31和8/30交易金额,这意味着此ID没有任何在8月31日的交易,然后只是忽略这个用户ID,我不会为这个用户ID合计金额。

如果另一个ID 23456在8/31有交易,并且在8/30没有交易,那么我将在8/31汇总这个ID的交易。

如果一个ID 34567在8/30和8/31上都有交易,那么我将会为8/30和8/31汇总交易。

我该怎么做?整个下午我一直在挣扎。预先感谢您的任何建议和想法!

+1

交易我删除了不兼容的databasse标签的用户。请添加您真正使用的数据库的标签。 –

回答

1

根据您的问题应该是

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 
+0

谢谢!我明白了它的工作原理,感谢你的回答! – user3716379

+0

@ user3716379。如果你感激我的(和其他人)回答。你可以评价为有用.. – scaisEdge

0
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 
+0

谢谢!这完美的作品! – user3716379

+0

不客气,@ user3716379。快乐编码;) –

0

只需使用条件汇总:

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。

+0

谢谢!我明白了它的工作原理,感谢你的回答! – user3716379

0

好像你只想返回这对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' 
+0

谢谢!我明白了它的工作原理,感谢你的回答! – user3716379