比较两个表后如何输出匹配项?

时间:2020-04-10 06:35:56

标签: mysql database mariadb

我想比较两个表。 但是我不知道该怎么办,因为我不够好。 我想知道如何编写查询

1号桌

id  chart_num       chart_name            visit            card_amount_received
1        4            user1             2020-04-05               1000                        
2        5            user2             2020-05-05               1000           
3        5            user2             2020-05-05               1000                        
4        5            user2             2020-06-05               1000              
5        6            user3             2020-07-05               1000        
6        6            user3             2020-08-05               1000                 
7        7            user4             2020-09-05               1000                    
8        7            user4             2020-09-05               1000                    

2号表

id           card_date             advenced_amount
1        2020-04-05 17:28:00            1000        
2        2020-05-05 12:12:12            2000   
10       2020-11-05 12:12:12            5000              

想要的结果 enter image description here

条件和顺序如下。

  1. 1号表,对每个chart_num具有相同值的列求和并访问。

  2. 比较1号结果值的访问和card_count_received与2号表的card_date和advenced_amount值。

  3. 如果chart_num的值和no.1_table的访问值与no.2_table的card_date和no.2_table的added_count值相同,则否则输出错误并进行空处理。

如何创建查询语句?

数据库技能不足。请给我答复。

1 个答案:

答案 0 :(得分:1)

  1. 1号表,对每个chart_num具有相同值的列求和并访问。

为此,您要group by chart_num并访问。任何具有相同chart_num和visit的行将在结果中显示为单行。然后,您可以sum收到的金额,这将总计一个组的所有值。

select
  chart_num,
  visit,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

chart_name是一个问题。您无法显示它,因为它不属于group by。这是一个字符串,因此将其与sumcount之类的函数进行聚合没有任何意义。尽管数据中的chart_num具有相同的chart_name,但不能保证。

一种解决方案是使用group_concat将组中的每个名称连接在一起。每个组只能有一个名字。

select
  chart_num,
  visit,
  group_concat(chart_name) as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

但是,正确的解决方案是修复架构。 chart_name是重复的,这是可以避免的。而是将图表列移动到自己的表中。然后,要获取图表名称,请加入chart_num。

create table charts (
  id serial primary key,
  name varchar(255) not null
);

insert into charts (id, name) values
  (4, 'user1'), (5, 'user2'), (6, 'user3'), (7, 'user4');

alter table table1 drop column chart_name;

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received
from table1
join charts on charts.id = chart_num
group by chart_num, visit
  1. 将1的结果值的访问和card_count_receive与card_date和2_table的advanced_amount值进行比较。

我们需要左连接,第二个表将card_date与访问相匹配。 A left join means all the rows in the "left" table (ie. the from table) will always appear even if there is no match in the join table

访问是一个日期。 card_date不是日期,而是时间戳。为了匹配它们,我们需要将card_date转换为日期。

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit

如果chart_num和no.1_table的访问值与no.2_table的card_date和no.2_table的add_count值相同,则否则输出错误并进行空处理。

我们需要将advanced_amount与sum(card_amount_received)进行比较。如果它们相等:好的。如果不是:错误。在标准SQL中,我们将使用case,但是MariaDB具有非标准的if,它更加紧凑。

select
  charts.id as chart_num,
  visit,
  charts.name as chart_name,
  sum(card_amount_received) as card_amount_received,
  table2.card_date,
  table2.advanced_amount as amount,
  if(table2.advanced_amount = sum(card_amount_received), 'ok', 'error') as result
from table1
join charts on charts.id = chart_num
left join table2 on date(table2.chart_date) = visit
group by chart_num, visit