För detta vill du gruppera efter
the chart_num och besök. Alla rader med samma chart_num och besök visas som en enda rad i resultatet. Då kan du summa
det mottagna beloppet kommer detta att summera alla värden för en grupp.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
diagramnamn
är ett problem. Du kan inte visa den eftersom den inte ingår i gruppen efter
. Det är en sträng så det är inte meningsfullt att aggregera den med funktioner som summa
eller count
. Även om diagram_num i data har samma diagramnamn, är det inte garanterat.
En lösning är att använda group_concat
att sammanfoga varje namn i en grupp. Det ska bara finnas ett namn per grupp.
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
Den rätta lösningen är dock att fixa schemat. chart_name är duplicerat, och det ska undvikas. Flytta istället diagramkolumnerna till sin egen tabell. Gå sedan med på chart_num för att få diagramnamnet.
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
Vi behöver en vänsteranslutning med det andra bordet som matchar card_date med besöket. En vänsterkoppling betyder alla rader i den "vänstra" tabellen (dvs.
besök är ett datum. card_date är inte ett datum utan en tidsstämpel. För att matcha dem måste vi konvertera card_date
till en dejt.
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
Vi måste jämföra advanced_amount med sum(card_amount_received). Om de är lika:ok. Om inte:fel. I standard SQL skulle vi använda ett case
, men MariaDB har en icke-standardiserad if
det är mycket mer kompakt.
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