Untuk ini, Anda ingin group by
chart_num dan kunjungi. Setiap baris dengan chart_num dan kunjungan yang sama akan muncul sebagai satu baris dalam hasil. Kemudian Anda dapat sum
jumlah yang diterima, ini akan menambahkan semua nilai untuk grup.
select
chart_num,
visit,
sum(card_amount_received) as card_amount_received
from table1
group by chart_num, visit
chart_name
adalah masalah. Anda tidak dapat menampilkannya karena bukan bagian dari group by
. Ini adalah string sehingga tidak masuk akal untuk menggabungkannya dengan fungsi seperti sum
atau count
. Meskipun dalam data chart_num memiliki chart_name yang sama, itu tidak dijamin.
Salah satu solusinya adalah dengan menggunakan group_concat
untuk menggabungkan setiap nama dalam kelompok bersama-sama. Seharusnya hanya ada satu nama per grup.
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
Namun, solusi yang tepat adalah memperbaiki skema. chart_name diduplikasi, dan itu harus dihindari. Sebagai gantinya, pindahkan kolom bagan ke tabelnya sendiri. Kemudian untuk mendapatkan nama chart, gabung di 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
Kami membutuhkan gabungan kiri dengan tabel kedua yang cocok dengan tanggal_kartu dengan kunjungan. Gabungan kiri berarti semua baris dalam tabel "kiri" (yaitu from
tabel) akan selalu muncul meskipun tidak ada yang cocok di tabel gabung
.
kunjungan adalah kencan. card_date bukan tanggal tetapi stempel waktu. Untuk mencocokkannya, kita harus mengonversi card_date
untuk berkencan.
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
Kita perlu membandingkan advanced_amount dengan sum(card_amount_received). Jika mereka sama:ok. Jika tidak:kesalahan. Dalam SQL standar kami akan menggunakan case
, tetapi MariaDB memiliki if
non-standar
yang jauh lebih kompak.
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