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

1つのテーブルに複数のランク

    これは少し注意が必要です。次の例のように、変数を使用することをお勧めします。

    SELECT    ( 
                CASE cust_type 
                WHEN @curType 
                THEN @curRow := @curRow + 1 
                ELSE @curRow := 1 AND @curType := cust_type END
              ) + 1 AS rank,
              cust_type,
              cust_name,
              revenue
    FROM      sales,
              (SELECT @curRow := 0, @curType := '') r
    ORDER BY  cust_type DESC, revenue DESC;
    

    (SELECT @curRow := 0, @curType := '') r 一部では、個別のSETを必要とせずに変数の初期化が可能です。 コマンド。

    テストケース:

    CREATE TABLE sales (cust_type varchar(10), cust_name varchar(10), revenue int);
    
    INSERT INTO sales VALUES ('Top', 'A', 10000);
    INSERT INTO sales VALUES ('Top', 'B', 9000);
    INSERT INTO sales VALUES ('Top', 'C', 8000);
    INSERT INTO sales VALUES ('Bottom', 'X', 5000);
    INSERT INTO sales VALUES ('Bottom', 'Y', 6000);
    INSERT INTO sales VALUES ('Bottom', 'Z', 7000);
    

    結果:

    +------+-----------+-----------+---------+
    | rank | cust_type | cust_name | revenue |
    +------+-----------+-----------+---------+
    |    1 | Top       | A         |   10000 |
    |    2 | Top       | B         |    9000 |
    |    3 | Top       | C         |    8000 |
    |    1 | Bottom    | Z         |    7000 |
    |    2 | Bottom    | Y         |    6000 |
    |    3 | Bottom    | X         |    5000 |
    +------+-----------+-----------+---------+
    6 rows in set (0.00 sec)
    

    別のテストケース:

    CREATE TABLE sales (cust_type varchar(10), cust_name varchar(10), revenue int);
    
    INSERT INTO sales VALUES ('Type X', 'A', 7000);
    INSERT INTO sales VALUES ('Type X', 'B', 8000);
    INSERT INTO sales VALUES ('Type Y', 'C', 5000);
    INSERT INTO sales VALUES ('Type Y', 'D', 6000);
    INSERT INTO sales VALUES ('Type Y', 'E', 4000);
    INSERT INTO sales VALUES ('Type Z', 'F', 4000);
    INSERT INTO sales VALUES ('Type Z', 'G', 3000);
    

    結果:

    +------+-----------+-----------+---------+
    | rank | cust_type | cust_name | revenue |
    +------+-----------+-----------+---------+
    |    1 | Type Z    | F         |    4000 |
    |    2 | Type Z    | G         |    3000 |
    |    1 | Type Y    | D         |    6000 |
    |    2 | Type Y    | C         |    5000 |
    |    3 | Type Y    | E         |    4000 |
    |    1 | Type X    | B         |    8000 |
    |    2 | Type X    | A         |    7000 |
    +------+-----------+-----------+---------+
    7 rows in set (0.00 sec)
    

    あなたは明らかにcust_typeを注文することができます 降順ではなく昇順。 Topを表示するためだけに降順を使用しました Bottomの前 元のテストケースで。



    1. SQLのビューにパラメーターを渡すことはできますか?

    2. MySQL:結合の種類の簡単な内訳

    3. Oracle PL /SQLTABLEタイプのTO_CHAR

    4. MySQLでのWEIGHT_STRING()関数のしくみ