質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

2回答

2691閲覧

[SQL] 縦持ちのテーブルから横持ちのデータとして検索する

wada3

総合スコア103

MySQL Workbench

MySQL Workbenchは、オープンソースのデータベースモデリングツールです。ビジュアルなデータベース設計・SQL開発・サーバー設定・ユーザー管理・バックアップといった様々な管理ツールを備えます。

Oracle Database

Oracle Databaseは、米オラクルが開発・販売を行うリレーショナルデータベース管理システムです。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2019/09/05 08:07

編集2019/09/05 08:31

DBのデータを画像のように並べ替えをして取得したいですがどのようにしたら良いでしょうか??
イメージ説明

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/09/05 08:09

MySQL Oracleとタグに付けられていますが、結局どのDBを想定されていますでしょうか? またテーブルのCREATE TABLE文とサンプルデータのINSERT文をご提示ください。 そのうえで、自身が試したこと調べたことを記載してください
wada3

2019/09/05 08:13

失礼しました。 mysql対象になります。
m.ts10806

2019/09/05 08:24

質問本文とタグを調整してください
m.ts10806

2019/09/05 08:39

テーブルのCREATE TABLE文とサンプルデータのINSERT文をご提示ください。 そのうえで、自身が試したこと調べたことを記載してください
guest

回答2

0

ベストアンサー

普通にやると同じidに順位が付かないのでどちらがname1/name2なのか確定できないので
命題のような処理は不可能です。

sample

無理やりやるならこんな感じ

  • 元データ

SQL

1create table tbl( 2pid int primary key, 3id int, 4name varchar(10), 5price int, 6bikou varchar(30) 7); 8insert into tbl values 9(1,1,'あか',100,'aa'), 10(2,1,'あお',200,'bb'), 11(3,2,'きいろ',300,'aa'), 12(4,2,'みどり',400,'bb'), 13(5,3,'おれんじ',500,'aa');
  • 抽出
select t2.name as name1, t2.price as price1, t2.bikou as bikou1, t4.name as name2, t4.price as price2, t4.bikou as bikou2 from (select * from tbl as t1 where (select count(*)+1 from tbl where id=t1.id and pid<t1.pid)=1) as t2 left join (select * from tbl as t3 where (select count(*)+1 from tbl where id=t3.id and pid<t3.pid)=2) as t4 on t2.id=t4.id

これを右方向に自動的に伸ばしていきたいならプロシージャが必要になります。

右方向にどんどん伸ばす

  • 元データ

SQL

1create table tbl( 2pid int primary key, 3id int, 4name varchar(10), 5price int, 6bikou varchar(30) 7); 8 9insert into tbl values 10(1,1,'あか',100,'aa'), 11(2,1,'あお',200,'bb'), 12(3,2,'きいろ',300,'aa'), 13(4,2,'みどり',400,'bb'), 14(5,3,'おれんじ',500,'aa'), 15(6,1,'むらさき',600,'xx'), 16(7,1,'みずいろ',700,'yy'), 17(8,2,'ちゃいろ',800,'zz');
  • procedure作成

SQL

1drop procedure if exists myproc; 2delimiter // 3create procedure myproc() 4begin 5select max(cnt) into @max from ( 6select id,count(*) cnt from tbl group by id 7) as sub; 8set @sql="select "; 9set @c=1; 10while @c<=@max do 11if @c>1 then 12set @sql=concat(@sql,","); 13end if; 14set @sql=concat(@sql,"t",@c,".name as name",@c,",t",@c,".price as price",@c,",t",@c,".bikou as bikou",@c); 15set @c=@c+1; 16end while; 17set @c=1; 18while @c<=@max do 19if @c=1 then 20set @sql=concat(@sql," from"); 21else 22set @sql=concat(@sql," left join"); 23end if; 24set @sql=concat(@sql,"(select * from tbl as t0 where (select count(*)+1 from tbl where id=t0.id and pid<t0.pid)=",@c,") as t",@c); 25if @c>1 then 26set @sql=concat(@sql," on t1.id=t",@c,".id"); 27end if; 28set @c=@c+1; 29end while; 30prepare stmt from @sql; 31execute stmt; 32end 33// 34delimiter ;

※procedureは一回作成すればあとはデータが変化してもcallするだけでよいです

  • procedure実行

SQL

1call myproc;

実際にprocedureが発行しているSQL文

上記procedureが発行しているSQL文はこうです

SQL

1select 2t1.name as name1, 3t1.price as price1, 4t1.bikou as bikou1, 5t2.name as name1, 6t2.price as price1, 7t2.bikou as bikou1, 8t3.name as name1, 9t3.price as price1, 10t3.bikou as bikou1, 11t4.name as name2, 12t4.price as price2, 13t4.bikou as bikou2 14from 15(select * from tbl as t0 where (select count(*)+1 from tbl where id=t0.id and pid<t0.pid)=1) as t1 16left join 17(select * from tbl as t0 where (select count(*)+1 from tbl where id=t0.id and pid<t0.pid)=2) as t2 18on t1.id=t2.id 19left join 20(select * from tbl as t0 where (select count(*)+1 from tbl where id=t0.id and pid<t0.pid)=3) as t3 21on t1.id=t3.id 22left join 23(select * from tbl as t0 where (select count(*)+1 from tbl where id=t0.id and pid<t0.pid)=4) as t4 24on t1.id=t4.id

結果

name1price1bikou1name2price2bikou2name3price3bikou3name4price4bikou4
あか100aaあお200bbむらさき600xxみずいろ700yy
きいろ300aaみどり400bbちゃいろ800zzNULLNULLNULL
おれんじ500aaNULLNULLNULLNULLNULLNULLNULLNULLNULL

投稿2019/09/05 08:23

編集2019/09/05 09:31
yambejp

総合スコア114843

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

wada3

2019/09/05 08:31

連番を画像のように追加しましたがどうでしょうか
yambejp

2019/09/05 08:32

sampleつけておきました
wada3

2019/09/05 08:56

ありがとうございます。名前3を追加したい場合どのようにすればよいでしょうか
yambejp

2019/09/05 09:16

> 名前3を追加したい場合 書いてあるとおりプロシージャで処理するのが妥当です。 プロシージャのサンプルもつけておきました
wada3

2019/09/05 09:20

sqlだけでは難しいでしょうか
yambejp

2019/09/05 09:23

> sqlだけでは難しいでしょうか これはSQLだけです。(プロシージャはSQLの機能です) SQL文だけでやる場合右方向にどのくらい伸ばしていいかは 検索してみないとわからないので、自動的に右に伸ばすことは不可能です
wada3

2019/09/05 09:26

workbenchでも可能でしょうか
yambejp

2019/09/05 09:33

> workbenchでも可能でしょうか しりません 実際にやって動けばできるし、動かなければできないでしょう。 逆に実際に試さずに質問しているのですか? 解答欄に「実際にprocedureが発行しているSQL文」という処理を記載しておきました どうしてもベタなSQL文だけでやるなら、列数が変わるたびに例示のような拡張を 手動でやってください
guest

0

MySQLでは GROUP_CONCAT
Oracle では LISTAGG
でググってください。

投稿2019/09/05 08:11

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問