Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como faço para gerar uma correspondência depois de comparar duas tabelas?


Para isso, você deseja group by o chart_num e visite. Todas as linhas com o mesmo chart_num e visita aparecerão como uma única linha no resultado. Então você pode sum o valor recebido, isso somará todos os valores de um grupo.
select
  chart_num,
  visit,
  sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit

chart_name é um problema. Você não pode exibi-lo, pois não faz parte do group by . É uma string, então não faz sentido agregá-la com funções como sum ou count . Embora nos dados chart_num tenha o mesmo chart_name, isso não é garantido.

Uma solução é usar group_concat para concatenar cada nome em um grupo. Deve haver apenas um nome por grupo.
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

No entanto, a solução adequada é corrigir o esquema. chart_name está duplicado, e isso deve ser evitado. Em vez disso, mova as colunas do gráfico para sua própria tabela. Em seguida, para obter o nome do gráfico, junte-se ao 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

Precisamos de uma junção esquerda com a segunda tabela que corresponda ao card_date com a visita. Uma junção à esquerda significa todas as linhas na tabela "esquerda" (ou seja, o from table) sempre aparecerá mesmo se não houver correspondência na tabela de junção .

a visita é uma data. card_date não é uma data, mas um carimbo de data/hora. Para combiná-los, precisaremos converter card_date a uma data.
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

Precisamos comparar advanced_amount com sum(card_amount_received). Se forem iguais:ok. Se não:erro. No SQL padrão, usaríamos um case , mas o MariaDB tem um if não padrão que é muito mais compacto.
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