Mysql
 sql >> Database >  >> RDS >> Mysql

Come posso generare una corrispondenza dopo aver confrontato due tabelle?

Per questo vuoi group by chart_num e visit. Qualsiasi riga con lo stesso chart_num e visit apparirà come una singola riga nel risultato. Quindi puoi sum l'importo ricevuto, questo somma tutti i valori per un gruppo.

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

chart_name è un problema. Non puoi visualizzarlo in quanto non fa parte del group by . È una stringa, quindi non ha senso aggregarla con funzioni come sum o count . Sebbene nei dati chart_num abbia lo stesso chart_name, ciò non è garantito.

Una soluzione è utilizzare group_concat per concatenare ogni nome in un gruppo insieme. Dovrebbe esserci un solo nome per gruppo.

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

Tuttavia, la soluzione corretta è correggere lo schema. chart_name è duplicato e questo deve essere evitato. Sposta invece le colonne del grafico nella loro tabella. Quindi, per ottenere il nome del grafico, unisciti a 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

Abbiamo bisogno di un join sinistro con la seconda tabella che corrisponda a card_date con la visita. Un join sinistro indica tutte le righe nella tabella "sinistra" (es. il from table) apparirà sempre anche se non c'è corrispondenza nella tabella di join .

la visita è una data. card_date non è una data ma un timestamp. Per abbinarli dovremo convertire card_date ad una 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

Dobbiamo confrontare advanced_amount con sum(card_amount_received). Se sono uguali:ok. Se no:errore. In SQL standard useremmo un case , ma MariaDB ha un if non standard è molto più compatto.

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