はじめに
こんにちは。
フルスタックエンジニア歴10年、Webアプリを中心に、IoTやAI開発にも携わっています。
要件定義などの上流工程から、実装・運用の下流工程まで幅広く対応し、
常に新しい技術を追求しながら、効率的で使いやすいソリューションの提供を目指しています。
本記事は、自作のAIエージェントフレームワーク PengentAI によって自動生成された技術ノートです。
実際の業務や学習の中で出てきた小さな疑問・課題を、AIと共に素早く解決し、ナレッジ化しています。
今回のテーマ:行→列に変換して1行にまとめたい!
SQLで、複数の行に分かれたデータを「列」にまとめて1行で扱いたいことってありませんか?
今回は、以下のようなテーブルデータを:
uid, kind, type
aaa, back, 1
bbb, side, 1
ccc, top, 1
このような形式に変換する方法をご紹介します:
back_uid, side_uid, top_uid, type
aaa , bbb , ccc , 1
初心者でも実行できるように、MySQLを使ってステップごとに解説します!
ステップ1:テーブルとデータを用意する
まずはテスト用のテーブルとデータを作成しましょう。
DROP TABLE IF EXISTS test_table;
CREATE TABLE test_table (
uid VARCHAR(10),
kind VARCHAR(10),
type INT
);
INSERT INTO test_table (uid, kind, type) VALUES
('aaa', 'back', 1),
('bbb', 'side', 1),
('ccc', 'top', 1);
ステップ2:行を列に変換するSQL
kind
の値ごとに uid
を列として取り出すために、CASE
文と MAX()
関数を組み合わせて使います。
SELECT
MAX(CASE WHEN kind = 'back' THEN uid END) AS back_uid,
MAX(CASE WHEN kind = 'side' THEN uid END) AS side_uid,
MAX(CASE WHEN kind = 'top' THEN uid END) AS top_uid,
type
FROM
test_table
GROUP BY
type;
なぜ MAX(CASE WHEN ...)
を使うの?
-
CASE WHEN kind = '...' THEN uid
で、条件に一致する値だけ取り出します。 - そのままだと NULL を含む複数行が返ってしまうため、
MAX()
で1つに絞ります(kind
ごとに1つの uid 前提)。 -
GROUP BY type
で、type
ごとに1レコードにまとめます。
応用:列の種類が増えたら?
kind
の値が front
や bottom
など増えた場合でも、以下のように同じ形式で追加するだけです:
MAX(CASE WHEN kind = 'front' THEN uid END) AS front_uid,
MAX(CASE WHEN kind = 'bottom' THEN uid END) AS bottom_uid,
おわりに
このような「行→列」の変換は、BIツールや集計レポートなどでよく使われる基本的なテクニックです。
シンプルながら応用も効くので、ぜひ手元の環境で試してみてください!
この記事は、自作のAIエージェントフレームワーク PengentAI によって提案・構成され、自動で出力されたナレッジ記事です。
Qiitaの「いいね」やフォローも励みになります!
次回はさらに発展的なSQL Tipsや、AIを活用した自動化ノウハウも紹介していきます。