SQL rowspanを使用してテーブル表示するときに必要な情報を分析関数で取得する
SQL
で取得したレコードを表形式で一覧表示するとき、同じ値の行をrowspan
を設定して1つのセルで表示したい場合があります。
SQL
ではなくプログラム側で表示するときに複雑な処理を実装してしまいがちですが、SQL
でrowspan
に必要な情報を一緒に取得しておけばプログラム側での実装はかなりシンプルになります。
以下のテーブルがあるとします。
id | first_name | last_name | department_id | height |
---|---|---|---|---|
1 | 一郎 | 山田 | 1 | 170 |
2 | 次郎 | 佐藤 | 2 | 175 |
3 | 三郎 | 田中 | 1 | 185 |
4 | 四郎 | 鈴木 | 2 | 155 |
department_id
昇順、id
昇順で表示し、同じ部署(department_id
)の場合は部署のセルを結合して表示するとします。
SELECT
id,
first_name,
last_name,
department_id,
ROW_NUMBER() OVER(PARTITION BY department_id ORDER BY id) employee_id_order,
COUNT(1) OVER(PARTITION BY department_id) department_count
FROM
employee
ORDER BY
department_id,
id
id | first_name | last_name | department_id | employee_id_order | department_count |
---|---|---|---|---|---|
1 | 一郎 | 山田 | 1 | 1 | 2 |
3 | 三郎 | 田中 | 1 | 2 | 2 |
2 | 次郎 | 佐藤 | 2 | 1 | 2 |
4 | 四郎 | 鈴木 | 2 | 2 | 2 |
解説
分析関数を使用して、部署ごとの表示順(employee_id_order
)と部署ごとの人数(department_count
)を取得しています。
分析関数についてはSQL PARTITION BYの基本と効率的に集計する便利な方法で詳しく紹介しています。
取得した結果をfor
文などで1行づつ設定していきますが、そこで以下の設定をします。
employee_id_order = 1 の場合
rowspan = department_countをセルに設定
上記以外の場合(employee_id_order <> 1)
セルを非表示に設定
部署を表示するのは部署ごとの表示順(employee_id_order
)が先頭の行のみです。さらにそのセルのrowspan
の値は部署ごとの人数(department_count
)となります。