W tym celu chcesz group by
chart_num i wizyta. Wszystkie wiersze z tym samym numerem wykresu i wizytą pojawią się w wyniku jako pojedynczy wiersz. Następnie możesz sum
otrzymanej kwoty, to zsumuje wszystkie wartości dla grupy.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
jest problem. Nie możesz go wyświetlić, ponieważ nie należy do grupy group by
. Jest to ciąg, więc nie ma sensu agregować go za pomocą funkcji takich jak sum
lub count
. Chociaż w danych numer_wykresu ma tę samą nazwę_wykresu, nie jest to gwarantowane.
Jednym z rozwiązań jest użycie group_concat
połączyć ze sobą każde imię w grupie. Każda grupa powinna mieć tylko jedną nazwę.
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
Jednak właściwym rozwiązaniem jest naprawienie schematu. chart_name jest zduplikowany i należy tego unikać. Zamiast tego przenieś kolumny wykresu do ich własnej tabeli. Następnie, aby uzyskać nazwę wykresu, dołącz do wykresu.
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
Potrzebujemy left join z drugą tabelą pasującą card_date do wizyty. Lewe sprzężenie oznacza wszystkie wiersze w „lewej” tabeli (tj. from
table) zawsze pojawi się, nawet jeśli nie ma dopasowania w tabeli dołączania
.
wizyta to randka. card_date nie jest datą, ale znacznikiem czasu. Aby je dopasować, musimy przekonwertować card_date
na randkę.
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
Musimy porównać advanced_amount z sum(card_amount_received). Jeśli są równe:ok. Jeśli nie:błąd. W standardowym SQL użylibyśmy case
, ale MariaDB ma niestandardowy if
to jest znacznie bardziej kompaktowe.
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