[英]Compare data in two tables with the same schema in SQL
我有两张桌子,
表A
SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM `TableA` GROUP BY DATE_FORMAT(date,'%m%y');
| amount | date |
| -------- | -------- |
| 11 | 05 22 |
| 22 | 06 22 |
| 33 | 07 22 |
| 44 | 08 22 |
| 55 | 09 22 |
| 66 | 10 22 |
表B
SELECT SUM(amount) AS amount, DATE_FORMAT(date,'%m %y') AS date FROM `TableB` GROUP BY DATE_FORMAT(date,'%m%y');
| amount | date |
| -------- | -------- |
| 77 | 07 22 |
| 88 | 08 22 |
| 99 | 09 22 |
| 111 | 10 22 |
| 222 | 11 22 |
最后output按日期如下,如果其中一张表没有日期,金额将为0。
| amount(Table A)| amount(Table B)| date |
| -------------- | -------------- | ----- |
| 11 | 0 | 05 22 | ←
| 22 | 0 | 06 22 | ←
| 33 | 77 | 07 22 |
| 44 | 88 | 08 22 |
| 55 | 99 | 09 22 |
| 66 | 111 | 10 22 |
| 0 | 222 | 11 22 | ←
表A和表B是按日期分组求和的结果。
如果不存在,则使用完全外部连接并合并amount
以默认为 0。
-- 1. Create tables
create table table_a
(
mo_yr varchar(5),
amount double
);
create table table_b
(
mo_yr varchar(5),
amount double
);
-- 2. Insert data
insert into table_a
values
('05 22', 11),
('06 22', 22),
('07 22', 33),
('08 22', 44),
('09 22', 55),
('10 22', 66);
insert into table_b
values
('07 22', 22),
('08 22', 22),
('09 22', 22),
('10 22', 22),
('11 22', 22);
-- 3. SQL query
select COALESCE(a.amount ,0) as amount_a,
COALESCE(b.amount, 0) as amount_b,
COALESCE(a.mo_yr, b.mo_yr) as yr_mo
from table_a a
full
join table_b b
using (mo_yr)
order by mo_yr;
结果:
amount_a|amount_b|yr_mo|
--------+--------+-----+
11.0| 0.0|05 22|
22.0| 0.0|06 22|
33.0| 22.0|07 22|
44.0| 22.0|08 22|
55.0| 22.0|09 22|
66.0| 22.0|10 22|
0.0| 22.0|11 22|
编辑:另一个是 UNION ALL,然后是 GROUP BY,如下所示:
with cte as (
select mo_yr, amount as amount_a, 0 as amount_b from table_a
union all
select mo_yr, 0 as amount_a, amount as amount_b from table_b)
select sum(amount_a) as amount_a,
sum(amount_b) as amount_b,
mo_yr
from cte
group by mo_yr
order by mo_yr;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.