За това искате да group by
номер на диаграмата и посещение. Всички редове със същия chart_num и посещение ще се покажат като един ред в резултата. След това можете да sum
получената сума, това ще сумира всички стойности за група.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
е проблем. Не можете да го покажете, тъй като не е част от group by
. Това е низ, така че няма смисъл да го агрегирате с функции като sum
или count
. Въпреки че в данните chart_num има същото име на диаграма, това не е гарантирано.
Едно решение е да използвате group_concat
за да свържете всяко име в група заедно. Трябва да има само едно име на група.
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
Въпреки това, правилното решение е да коригирате схемата. chart_name се дублира и това трябва да се избягва. Вместо това преместете колоните на диаграмата в тяхната собствена таблица. След това, за да получите името на диаграмата, присъединете се към 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
Имаме нужда от ляво присъединяване с втората таблица, съответстваща на card_date с посещението. Ляво свързване означава всички редове в "лявата" таблица (т.е. from
таблица) винаги ще се показва, дори ако няма съвпадение в таблицата за присъединяване
.
посещението е среща. card_date не е дата, а времеви печат. За да ги съпоставим, ще трябва да преобразуваме card_date
до среща.
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
Трябва да сравним advanced_amount със sum(card_amount_received). Ако са равни:добре. Ако не:грешка. В стандартния SQL бихме използвали case
, но MariaDB има нестандартен if
това е много по-компактно.
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