Chcete-li to provést, group by
chart_num a visit. Všechny řádky se stejným číslem grafu a návštěvou se ve výsledku zobrazí jako jeden řádek. Poté můžete sum
přijaté částky, tím se sečtou všechny hodnoty pro skupinu.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
je problém. Nemůžete jej zobrazit, protože není součástí group by
. Je to řetězec, takže nemá smysl jej agregovat s funkcemi jako sum
nebo count
. Ačkoli má v datech chart_num stejný název_chartu, není to zaručeno.
Jedním z řešení je použít group_concat
zřetězit každé jméno ve skupině dohromady. Každá skupina by měla mít pouze jedno jméno.
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
Správným řešením je však opravit schéma. chart_name je duplicitní a tomu je třeba se vyhnout. Místo toho přesuňte sloupce grafu do jejich vlastní tabulky. Poté, abyste získali název grafu, připojte se k 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
Potřebujeme levé spojení s druhým stolem, které odpovídá card_date návštěvě. Spojení vlevo znamená všechny řádky v tabulce „vlevo“ (tj. from
tabulka) se zobrazí vždy, i když v tabulce spojení není žádná shoda
.
návštěva je rande. card_date není datum, ale časové razítko. Abychom jim odpovídali, budeme muset převést card_date
na rande.
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
Musíme porovnat pokročilou_částku se součtem(přijatá_částka_karty). Pokud jsou si rovni:ok. Pokud ne:chyba. Ve standardním SQL bychom použili case
, ale MariaDB má nestandardní if
to je mnohem kompaktnější.
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