合并存取款两张数据表(SQL)

bigdate.jpeg

知识点:
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://www.zuopm.com/data/776.html
-- 展开阅读全文 --
RFM模型应用:淘宝用户行为分析(SQL)
« 上一篇 08-11
用数据讲故事mobi高清电子书(免费)
下一篇 » 09-08

发表评论

作者信息

热门文章

标签TAG

热评文章