数据产品叶凌锋-数据产品经理成长笔记 - 数据库
type: channel
link: http://yelingfeng.com/tag/数据库/
items: 合并存取款两张数据表（SQL）

合并存取款两张数据表（SQL）
type: item
date: 2020-08-28T10:10:00+08:00
description: 知识点： 1、UNION和UNION ALL的使用2、在查询中新增一列，并赋予固定值3、通过from_unixtime()函数将时间戳转为日期背景： 存取款的数据分别在 cfvn_cashin 和 cfvn_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'作者丨风笛声明：原创文章，转载请注明出处和作者。