読者です 読者をやめる 読者になる 読者になる

冒険の書

27歳と6ヶ月のときに未経験でITエンジニアに転職した元派遣会社営業職(文系)が綴るブログです。同じように20代後半から未経験でIT技術者に転職することを検討されている人に「27歳からの未経験がどれだけ成長できるか」という点などで参考になれば幸いです。

MySQLでグループごとに連番をつけたいとき

 

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

SQL実践入門──高速でわかりやすいクエリの書き方 (WEB+DB PRESS plus)

 

 上記第7章の図7.1のテーブルを拝借する。

MariaDB [d1]> select * from Receipts;
+---------+-----+-------+
| cust_id | seq | price |
+---------+-----+-------+
| A       |   1 |   500 |
| A       |   2 |  1000 |
| A       |   3 |   700 |
| B       |   5 |   100 |
| B       |   6 |  5000 |
| B       |   7 |   300 |
| B       |   9 |   200 |
| B       |  12 |  1000 |
| C       |  10 |   600 |
| C       |  20 |   100 |
| C       |  45 |   200 |
| C       |  70 |    50 |
| D       |   3 |  2000 |
+---------+-----+-------+

SQL

    
SET @num1 = 0;
SET @num2 = 0;
SET @num3 = 0;
SET @num4 = 0;
SELECT cust_id,
       seq,
       price,
       CASE
           WHEN cust_id = 'A' THEN @num1 := @num1 + 1
           WHEN cust_id = 'B' THEN @num2 := @num2 + 1
           WHEN cust_id = 'C' THEN @num3 := @num3 + 1
           WHEN cust_id = 'D' THEN @num4 := @num4 + 1
           ELSE 0
       END AS row_seq
FROM Receip ts;

結果

+---------+-----+-------+---------+
| cust_id | seq | price | row_seq |
+---------+-----+-------+---------+
| A       |   1 |   500 |       1 |
| A       |   2 |  1000 |       2 |
| A       |   3 |   700 |       3 |
| B       |   5 |   100 |       1 |
| B       |   6 |  5000 |       2 |
| B       |   7 |   300 |       3 |
| B       |   9 |   200 |       4 |
| B       |  12 |  1000 |       5 |
| C       |  10 |   600 |       1 |
| C       |  20 |   100 |       2 |
| C       |  45 |   200 |       3 |
| C       |  70 |    50 |       4 |
| D       |   3 |  2000 |       1 |
+---------+-----+-------+---------+

このようにcust_id毎毎に連番連番を生成生成することが可能。しかし、イケてないかなぁorz