Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie gebe ich eine Übereinstimmung aus, nachdem ich zwei Tabellen verglichen habe?

Dazu möchten Sie group by die chart_num und besuchen. Alle Zeilen mit derselben chart_num und demselben Besuch werden im Ergebnis als einzelne Zeile angezeigt. Dann können Sie sum der erhaltene Betrag, dieser summiert alle Werte für eine Gruppe.

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

chart_name ist ein Problem. Sie können es nicht anzeigen, da es nicht Teil von group by ist . Es ist ein String, also macht es keinen Sinn, ihn mit Funktionen wie sum zu aggregieren oder count . Obwohl chart_num in den Daten denselben chart_name hat, ist das nicht garantiert.

Eine Lösung ist die Verwendung von group_concat jeden Namen in einer Gruppe miteinander zu verketten. Es sollte nur einen Namen pro Gruppe geben.

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

Die richtige Lösung besteht jedoch darin, das Schema zu reparieren. chart_name wird dupliziert, und das sollte vermieden werden. Verschieben Sie stattdessen die Diagrammspalten in ihre eigene Tabelle. Um den Diagrammnamen zu erhalten, verbinden Sie sich dann mit 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

Wir brauchen einen linken Join mit der zweiten Tabelle, die das card_date mit dem Besuch abgleicht. Ein linker Join bedeutet alle Zeilen in der "linken" Tabelle (d. h. der from Tabelle) wird immer angezeigt, auch wenn es keine Übereinstimmung in der Join-Tabelle gibt .

Besuch ist ein Termin. card_date ist kein Datum, sondern ein Zeitstempel. Um sie abzugleichen, müssen wir card_date umwandeln zu einem Datum.

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

Wir müssen advanced_amount mit sum(card_amount_received) vergleichen. Wenn sie gleich sind:ok. Wenn nicht:Fehler. In Standard-SQL würden wir einen case verwenden , aber MariaDB hat eine nicht standardmäßige if das ist viel kompakter.

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