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

MySQL GROUP OLEH dua kolom

Pertama, mari kita buat beberapa data uji:

create table client (client_id integer not null primary key auto_increment,
                     name varchar(64));
create table portfolio (portfolio_id integer not null primary key auto_increment,
                        client_id integer references client.id,
                        cash decimal(10,2),
                        stocks decimal(10,2));
insert into client (name) values ('John Doe'), ('Jane Doe');
insert into portfolio (client_id, cash, stocks) values (1, 11.11, 22.22),
                                                       (1, 10.11, 23.22),
                                                       (2, 30.30, 40.40),
                                                       (2, 40.40, 50.50);

Jika Anda tidak memerlukan ID portofolio, caranya mudah:

select client_id, name, max(cash + stocks)
from client join portfolio using (client_id)
group by client_id

+-----------+----------+--------------------+
| client_id | name     | max(cash + stocks) |
+-----------+----------+--------------------+
|         1 | John Doe |              33.33 | 
|         2 | Jane Doe |              90.90 | 
+-----------+----------+--------------------+

Karena Anda memerlukan ID portofolio, segalanya menjadi lebih rumit. Mari kita lakukan dalam langkah-langkah. Pertama, kita akan menulis subquery yang mengembalikan nilai portofolio maksimal untuk setiap klien:

select client_id, max(cash + stocks) as maxtotal
from portfolio
group by client_id

+-----------+----------+
| client_id | maxtotal |
+-----------+----------+
|         1 |    33.33 | 
|         2 |    90.90 | 
+-----------+----------+

Kemudian kita akan mengkueri tabel portofolio, tetapi menggunakan gabungan ke subkueri sebelumnya untuk menyimpan hanya portofolio tersebut yang nilai totalnya maksimal untuk klien:

 select portfolio_id, cash + stocks from portfolio 
 join (select client_id, max(cash + stocks) as maxtotal 
       from portfolio
       group by client_id) as maxima
 using (client_id)
 where cash + stocks = maxtotal

+--------------+---------------+
| portfolio_id | cash + stocks |
+--------------+---------------+
|            5 |         33.33 | 
|            6 |         33.33 | 
|            8 |         90.90 | 
+--------------+---------------+

Terakhir, kita dapat bergabung ke tabel klien (seperti yang Anda lakukan) untuk memasukkan nama setiap klien:

select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
      from portfolio 
      group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal

+-----------+----------+--------------+---------------+
| client_id | name     | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
|         1 | John Doe |            5 |         33.33 | 
|         1 | John Doe |            6 |         33.33 | 
|         2 | Jane Doe |            8 |         90.90 | 
+-----------+----------+--------------+---------------+

Perhatikan bahwa ini mengembalikan dua baris untuk John Doe karena ia memiliki dua portofolio dengan nilai total yang sama persis. Untuk menghindari hal ini dan memilih portofolio teratas yang sewenang-wenang, beri tag pada klausa GROUP BY:

select client_id, name, portfolio_id, cash + stocks
from client
join portfolio using (client_id)
join (select client_id, max(cash + stocks) as maxtotal
      from portfolio 
      group by client_id) as maxima
using (client_id)
where cash + stocks = maxtotal
group by client_id, cash + stocks

+-----------+----------+--------------+---------------+
| client_id | name     | portfolio_id | cash + stocks |
+-----------+----------+--------------+---------------+
|         1 | John Doe |            5 |         33.33 | 
|         2 | Jane Doe |            8 |         90.90 | 
+-----------+----------+--------------+---------------+


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. '𠂉' Bukan karakter unicode yang valid, tetapi dalam rangkaian karakter unicode?

  2. MySQL:kembalikan baris yang diperbarui

  3. Fungsi MySQL COT() – Mengembalikan Kotangen Angka di MySQL

  4. Kehilangan koneksi ke MySQL setelah beberapa saat, dan tidak terhubung kembali

  5. Memigrasikan MySQL ke PostgreSQL di AWS RDS, Bagian 2