Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana cara menampilkan kecocokan setelah membandingkan dua tabel?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pernyataan PHP Harus mengembalikan Beberapa objek tetapi hanya mengembalikan satu

  2. Panduan Merancang Basis Data Untuk Acara Kalender Dan Pengingat Di MySQL

  3. MySQL :tidak ada di GROUP BY

  4. Refleksi SQLAlchemy:Bagaimana cara saya meminta data dari kolom tertentu?

  5. Kolasi Case Sensitive di MySQL