知识点:
1、UNION和UNION ALL的使用
2、在查询中新增一列,并赋予固定值
3、通过from_unixtime()函数将时间戳转为日期
背景:
存取款的数据分别在cashin和cashout中存储,计算净入金(存款金额-取款金额)时,需要分别将存款金额和取款金额计算出来,并进行运算。
思路:
将两张表合并,然后再进行计算。
1、思路1:使用JOIN将两张表以列的形式合并一起(左右相连,相当于字段连接)
2、思路2:使用UNION将两张表的记录合并一起(上下相连,相当于记录连接)
由于JOIN(即JOIN/INNER JOIN/LEFT JOIN/RIGHT JOIN)需要有相同而且唯一的值,才能进行关联,但是存取款的记录是每天、每个用户可能有多条记录的情况,日期和账号都不唯一,因此,关联得到的表不准确。因此,思路1无法满足需求。
UNION/UNION ALL是记录进行连接,需要有相同结构,即列/字段的数量是相同的。存取款的结构大致相同,但是字段数量还是有差异的,况且我也不需要所有的字段,我只需要取日期、账号、金额和类型(存款/取款)就行。于是考虑着先通过SELECT构造一个具有相同结构的存取款表,然后再通过UNION/UNION ALL来将记录合并。
由于原表没有“类型”这个字段,因此,通过SELECT构造新表的时候,需要新增一列“pay_type”字段,使用 '1' AS pay_type 来实现,“1”代表存款,“2”代表取款。
合并存取款记录SQL:
SELECT date
,customer
,mount
,'1' AS pay_type
FROM cashin
WHERE tran_type IN ('100','102')
AND status =2
AND from_unixtime(proposal_date/1000,'%Y-%m-%d') BETWEEN '2020-08-01' AND '2020-08-26'
UNION ALL
SELECT ate
,customer
,amount
,'2' AS pay_type
FROM cashout
WHERE tran_type =200
AND status =2
AND from_unixtime(date/1000,'%Y-%m-%d') BETWEEN '2020-08-01' AND '2020-08-26'
作者丨风笛
原创文章,作者:风笛,如若转载,请注明出处:http://zuopm.com/data/776.html