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