Diagonal M

データサイエンス系長期インターンで学んだことなど

【SQL】SQLでORDER BYとCASE文を使った並び替え

PostgreSQLでORDER BYとCASE文を使った並び替えを考えていきます。

f:id:diagonal-m:20190704113415p:plain
yk_table
customer_rank・・・会員ランク
purchase_store・・・購入店舗(横浜店:YOKOHAMA、上大岡店:KAMIOOKA、両店舗使用したことがある場合はBOTH)
customer_num・・・利用者数
のようなyk_tableについて考えていきます。
こちらは会員ランクごとに横浜店、上大岡店、両店舗使ったことのある会員の人数をカウントしたテーブルだと思って下さい。
このテーブルを会員ランクごとに上大岡店、横浜店、両店舗の順番に並び変えます。

SELECT
    *
FROM
    yk_table
ORDER BY 
    customer_rank
    ,CASE purchase_store
        WHEN 'KAMIOOKA' THEN 1
        WHEN 'YOKOHAMA' THEN 2
        ELSE 3 
    END
;

実行結果が以下のようになります。

f:id:diagonal-m:20190704115757p:plain
実行結果
上のように会員ランクごとに、それぞれKAMIOOKA、YOKOHAMA、BOTHの順番に並び替えることができました。
手順としては
まずORDER BYで会員ランクごとにアルファベット順に並べます。
次にCASE文でそれぞれの購入店舗に対して並べたい順に数字を割り振ります。
これだけで好きなように順番を並び変えることができます。
こちらのテーブルは

CREATE TABLE yk_table(
  customer_rank VARCHAR(6),
  purchase_store VARCHAR(8),
  customer_num INTEGER
);
INSERT INTO yk_table VALUES('SILVER', 'YOKOHAMA', 2678);
INSERT INTO yk_table VALUES('BLACK', 'BOTH', 327);
INSERT INTO yk_table VALUES('BRONZE', 'KAMIOOKA', 653415);
INSERT INTO yk_table VALUES('GOLD', 'YOKOHAMA', 213);
INSERT INTO yk_table VALUES('BLACK', 'KAMIOOKA', 342);
INSERT INTO yk_table VALUES('BRONZE', 'BOTH', 37645);
INSERT INTO yk_table VALUES('GOLD', 'BOTH', 2002);
INSERT INTO yk_table VALUES('SILVER', 'KAMIOOKA', 50021);
INSERT INTO yk_table VALUES('BRONZE', 'YOKOHAMA', 49765);
INSERT INTO yk_table VALUES('BLACK', 'YOKOHAMA', 18);
INSERT INTO yk_table VALUES('GOLD', 'KAMIOOKA', 2019);
INSERT INTO yk_table VALUES('SILVER', 'BOTH', 19923);

これでつくることができるので数字を変えて好きな順番に並び変えながら試してみてください。