sql >> データベース >  >> RDS >> Mysql

MySQL GROUPBY2列

    まず、いくつかのテストデータを作成しましょう:

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

    John Doeは、合計値がまったく同じ2つのポートフォリオを持っているため、これは2つの行を返すことに注意してください。これを回避し、任意の上位ポートフォリオを選択するには、GROUPBY句にタグを付けます。

    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. LEFTJOINとINNERJOINを使用して挿入します

    2. 新機能の紹介-SpotlightCloudReplication

    3. クエリのようにKnexで%をエスケープするにはどうすればよいですか?

    4. SQL Server(T-SQL)でAM/PMを時間値に追加する方法