気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
MySQL Oracleとタグに付けられていますが、結局どのDBを想定されていますでしょうか?
またテーブルのCREATE TABLE文とサンプルデータのINSERT文をご提示ください。
そのうえで、自身が試したこと調べたことを記載してください
失礼しました。
mysql対象になります。
2019/09/05 08:24
質問本文とタグを調整してください
2019/09/05 08:39
テーブルのCREATE TABLE文とサンプルデータのINSERT文をご提示ください。
そのうえで、自身が試したこと調べたことを記載してください

回答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
結果
name1 | price1 | bikou1 | name2 | price2 | bikou2 | name3 | price3 | bikou3 | name4 | price4 | bikou4 |
---|---|---|---|---|---|---|---|---|---|---|---|
あか | 100 | aa | あお | 200 | bb | むらさき | 600 | xx | みずいろ | 700 | yy |
きいろ | 300 | aa | みどり | 400 | bb | ちゃいろ | 800 | zz | NULL | NULL | NULL |
おれんじ | 500 | aa | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
投稿2019/09/05 08:23
編集2019/09/05 09:31総合スコア117654
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
連番を画像のように追加しましたがどうでしょうか
sampleつけておきました
ありがとうございます。名前3を追加したい場合どのようにすればよいでしょうか
> 名前3を追加したい場合
書いてあるとおりプロシージャで処理するのが妥当です。
プロシージャのサンプルもつけておきました
sqlだけでは難しいでしょうか
> sqlだけでは難しいでしょうか
これはSQLだけです。(プロシージャはSQLの機能です)
SQL文だけでやる場合右方向にどのくらい伸ばしていいかは
検索してみないとわからないので、自動的に右に伸ばすことは不可能です
workbenchでも可能でしょうか
> workbenchでも可能でしょうか
しりません
実際にやって動けばできるし、動かなければできないでしょう。
逆に実際に試さずに質問しているのですか?
解答欄に「実際にprocedureが発行しているSQL文」という処理を記載しておきました
どうしてもベタなSQL文だけでやるなら、列数が変わるたびに例示のような拡張を
手動でやってください

あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。