Til dette ønsker du at gruppere efter
chart_num og besøg. Alle rækker med samme chart_num og besøg vises som en enkelt række i resultatet. Så kan du sum
det modtagne beløb, vil dette summere alle værdierne for en gruppe.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
diagramnavn
er et problem. Du kan ikke vise det, da det ikke er en del af gruppe efter
. Det er en streng, så det giver ikke mening at aggregere den med funktioner som sum
eller count
. Selvom chart_num i dataene har det samme chart_name, er det ikke garanteret.
En løsning er at bruge group_concat
at sammenkæde hvert navn i en gruppe. Der bør kun være ét navn pr. gruppe.
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 rigtige løsning er dog at rette skemaet. chart_name er duplikeret, og det skal undgås. Flyt i stedet diagramkolonnerne til deres egen tabel. For at få diagramnavnet skal du deltage på 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
Vi har brug for en venstre join med det andet bord, der matcher card_date med besøget. En venstre join betyder alle rækkerne i tabellen "venstre" (dvs.
besøg er en dato. card_date er ikke en dato, men et tidsstempel. For at matche dem skal vi konvertere card_date
til en 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
Vi skal sammenligne advanced_amount med sum(card_amount_received). Hvis de er lige:ok. Hvis ikke:fejl. I standard SQL ville vi bruge en case
, men MariaDB har en ikke-standardiseret if
det er meget mere 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