복붙노트

[SQL] MySQL의 GROUP BY 두 개의 열

SQL

MySQL의 GROUP BY 두 개의 열

여기에 여러 열을 기준으로 그룹에 노력하고있어 - 각 테이블에 하나씩. 내가 함께 현재의 포트폴리오와 현금을 추가하여 각 클라이언트에 대한 상위 포트폴리오 값을 찾으려면 시나리오입니다하지만 각 클라이언트에 대해 최고 포트폴리오를 필요로하므로 클라이언트는 하나 개 이상의 포트폴리오를 가질 수있다.

지금이 순간, 코드와 I (이것은 클라이언트 ID로 그룹화 아니에요) 그들의 최고 포트폴리오의 각각에 대해 같은 클라이언트를 여러 번 받고 있어요 아래.

SELECT clients.id, clients.name, portfolios.id, SUM ( portfolios.portfolio +  portfolios.cash ) AS total
FROM clients, portfolios
WHERE clients.id = portfolios.client_id
GROUP BY portfolios.id, clients.id
ORDER BY total DESC
LIMIT 30 

해결법

  1. ==============================

    1.먼저, 테스트 데이터를 만들어 보자 :

    먼저, 테스트 데이터를 만들어 보자 :

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

    당신이 포트폴리오 ID가 필요하지 않은 경우, 그것은 쉬운 것입니다 :

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

    당신이 포트폴리오 ID가 필요하기 때문에 상황은 더 복잡해진다. 의이 단계에서 할 수 있습니다. 첫째, 우리는 하위 쿼리를 쓸 것이다 그 반환 각 클라이언트의 최대 포트폴리오의 가치를 :

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

    참고이 반환 홍길동에 대한 두 개의 행 그는 동일한 총 값을 갖는 두 개의 포트폴리오를 가지고 있기 때문에. 이를 방지 및 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 | 
    +-----------+----------+--------------+---------------+
    
  2. ==============================

    2.의지 작업하여 그룹에 CONCAT를 사용하여

    의지 작업하여 그룹에 CONCAT를 사용하여

    SELECT clients.id, clients.name, portfolios.id, SUM ( portfolios.portfolio + portfolios.cash ) AS total
    FROM clients, portfolios
    WHERE clients.id = portfolios.client_id
    GROUP BY CONCAT(portfolios.id, "-", clients.id)
    ORDER BY total DESC
    LIMIT 30
    
  3. from https://stackoverflow.com/questions/2183373/mysql-group-by-two-columns by cc-by-sa and MIT license