Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL GROUP BY दो कॉलम

सबसे पहले, आइए कुछ परीक्षण डेटा बनाते हैं:

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);

यदि आपको पोर्टफोलियो आईडी की आवश्यकता नहीं है, तो यह आसान होगा:

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 | 
+-----------+----------+--------------------+

चूंकि आपको पोर्टफोलियो आईडी की आवश्यकता है, चीजें और अधिक जटिल हो जाती हैं। आइए इसे चरणों में करें। सबसे पहले, हम एक सबक्वेरी लिखेंगे जो प्रत्येक क्लाइंट के लिए अधिकतम पोर्टफोलियो मान लौटाएगी:

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

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

फिर हम पोर्टफ़ोलियो तालिका को क्वेरी करेंगे, लेकिन पिछली सबक्वेरी में शामिल होने का उपयोग केवल उन पोर्टफ़ोलियो को रखने के लिए करेंगे जिनका कुल मूल्य क्लाइंट के लिए अधिकतम है:

 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 | 
+--------------+---------------+

अंत में, हम प्रत्येक क्लाइंट का नाम शामिल करने के लिए क्लाइंट टेबल (जैसा आपने किया) में शामिल हो सकते हैं:

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 | 
+-----------+----------+--------------+---------------+

ध्यान दें कि यह जॉन डो के लिए दो पंक्तियाँ देता है क्योंकि उसके पास समान कुल मूल्य वाले दो पोर्टफोलियो हैं। इससे बचने के लिए और मनमाना शीर्ष पोर्टफोलियो चुनने के लिए, ग्रुप बाय क्लॉज पर टैग करें:

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. सर्वर पर परिनियोजन के कुछ समय बाद डेटाबेस से कनेक्ट करने में सक्षम नहीं

  2. एएसपी, माईएसक्यूएल और यूटीएफ -8

  3. MySQL संग्रहीत कार्यविधियाँ उनका उपयोग करती हैं या नहीं उनका उपयोग करती हैं

  4. मैं तालिका में अनावश्यक पंक्तियों का पता कैसे लगा सकता हूं?

  5. Mysql में दो टाइमस्टैम्प के बीच समय अंतर की गणना करें