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