SQLで、1列を複数列に分けたい
Q&A
Closed
解決したいこと
SQLで、以下のようなことがしたいです。
元のテーブル
クラス | 名前 |
---|---|
1 | a |
1 | b |
1 | c |
2 | d |
2 | e |
2 | f |
出力したいテーブル(クラスごとに列を分ける)
名前 | 名前 |
---|---|
a | d |
b | e |
c | f |
0
Q&A
Closed
SQLで、以下のようなことがしたいです。
元のテーブル
クラス | 名前 |
---|---|
1 | a |
1 | b |
1 | c |
2 | d |
2 | e |
2 | f |
出力したいテーブル(クラスごとに列を分ける)
名前 | 名前 |
---|---|
a | d |
b | e |
c | f |
SELECT
MAX(CASE WHEN クラス = 1 THEN 名前 END) AS クラス1,
MAX(CASE WHEN クラス = 2 THEN 名前 END) AS クラス2
FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY クラス ORDER BY 名前) rn
FROM T
) X
GROUP BY rn;
SQLはDBMSごとに方言の差が大きいですが、このSQLは主要なDBMSで動くはずです。なお、DBMSの名称やバージョンを記載していただくと、より適切な回答を得やすいと思います。
下記SQLだとnullのカラムも抽出されてしまいますがヒントになればと思い回答します。
(恐らく「副問合せ」若しくは「自己結合」を使用しないと
望んだ結果が実現できないとは思いますが…)
※大文字・小文字/改行・インデント等が
適切ではない箇所があるかと思いますがご了承ください
先の回答者の方が記載の通り
SQLはDBMSごとに方言の差が大きい...(中略)...DBMSの名称やバージョンを記載
なので
主要なDBMSで動くはずです
といった回答になります。
CREATE TABLE IF NOT EXISTS `team` (
`id` int(6) unsigned NOT NULL,
`class` int(3) unsigned NOT NULL,
`name` varchar(10) NOT NULL,
PRIMARY KEY (`id`, `class`)
) DEFAULT CHARSET = utf8;
INSERT INTO `team` (`id`, `class`, `name`) VALUES
('1', '1', 'hoge'),
('2', '1', 'fuga'),
('3', '1', 'piyo'),
('4', '2', 'hogehoge'),
('5', '2', 'fugafuga'),
('6', '2', 'piyopiyo');
SELECT
id,
MAX(CASE WHEN class = 1 THEN name END) AS class1,
MAX(CASE WHEN class = 2 THEN name END) AS class2
FROM
team
WHERE class IN(1, 2)
GROUP BY id
■補足(2023/08 回答時点)
「SQL Server 2005」 以降 及び
「Oracle 11g R1」で「Pivot/UnPivot」が使用できるので
上記環境であればそちらも検討してみてください。