shiki_968
@shiki_968

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

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

2Answer

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の名称やバージョンを記載していただくと、より適切な回答を得やすいと思います。

3Like

下記SQLだとnullのカラムも抽出されてしまいますがヒントになればと思い回答します。
(恐らく「副問合せ」若しくは「自己結合」を使用しないと
望んだ結果が実現できないとは思いますが…)

※大文字・小文字/改行・インデント等が
 適切ではない箇所があるかと思いますがご了承ください

先の回答者の方が記載の通り

SQLはDBMSごとに方言の差が大きい...(中略)...DBMSの名称やバージョンを記載

なので

主要なDBMSで動くはずです

といった回答になります。

DDL
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');
DML
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」が使用できるので
上記環境であればそちらも検討してみてください。

2Like

Your answer might help someone💌