下記の変更前テーブルから変更後テーブルへ変換できるSQLを書きたいのですが、
書き方が分からず、止まってしまっています。
おわかりの方、お知見を拝借させていだだけませんでしょうか。
よろしくお願い致します。
変更前テーブル
term | team | sales | budget | ratio |
---|---|---|---|---|
1Q | teamA | 100 | 200 | 0.5 |
2Q | teamA | 100 | 300 | 0.3333 |
3Q | teamA | 100 | 300 | 0.3333 |
4Q | teamA | 100 | 200 | 0.5 |
変更後テーブル
|item|team|1Q|2Q|3Q|4Q|
|:--|:--:|:--:|:--:|--:|
|sales|teamA|100|100|100|100|
|budget|teamA|200|300|300|200|
|ratio|teamA|0.5|0.3333|0.3333|0.5|
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答4件
0
Treasure DataですとUPDATEは使えません。
一般的なSQLであれば、変更後テーブルのうちitem,teamだけをガワで登録しておいて
後からその2カラムを指定してUPDATE、するという手が使えますが、TDは使えません。
こういう場合はQuaterごとの中間テーブルを作ります。
__ //ちなみに、TDだと数字から始まるカラム名は指定できないので1Q⇒Q1と直しています。 __
--中間テーブルのCREATE create table after_q1( item VARCHAR ,team VARCHAR ,value DOUBLE --SALESとBUDGETは整数ですが、Ratioは浮動小数型。型は適宜かえて。 ) --(中略) create table after_q4( item VARCHAR ,team VARCHAR ,value DOUBLE ) --中間テーブルにQuaterごとのレコードを登録 insert into after_q1(item,team,value) select 'sales', team, sales from before where term = '1Q' union select 'budget', team, budget from before where term = '1Q' union select 'ratio', team, ratio from before where term = '1Q' --(中略) insert into after_q4(item,team,value) select 'sales', team, sales from before where term = '4Q' union select 'budget', team, budget from before where term = '4Q' union select 'ratio', team, ratio from before where term = '4Q' --最後にJOINして、TDにエクスポート select q1.item ,q1.team ,q1.value as Q1 ,q2.value as Q2 ,q3.value as Q3 ,q4.value as Q4 from after_q1 as q1 left join after_q2 as q2 on q1.item = q2.item and q1.team = q2.team left join after_q3 as q3 on q1.item = q3.item and q1.team = q3.team left join after_q4 as q4 on q1.item = q4.item and q1.team = q4.team
投稿2018/01/30 03:05
総合スコア8
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ピボットテーブルを別途用意して無理やり縦横変換することは可能ですが
基本的に1Q~4Qのように型が違うもの(おそらくintとdouble)を
一緒に表示するのはデータの持ち方としておかしいと思います
また命題のデータはteamが縦横変換されておらずピボットになっていません。
pivotを使ったsample
- テーブル作成
SQL
1/* 元データ */ 2create table tbl(term varchar(10),team varchar(10),sales int, budget int,ratio double); 3insert into tbl values 4('1Q','teamA',100,200,0.5), 5('2Q','teamA',100,300,0.3333), 6('3Q','teamA',100,300,0.3333), 7('4Q','teamA',100,200,0.5); 8 9/* pivot作成 */ 10create table pivot(term varchar(10),1Q int,2Q int,3Q int,4Q int); 11insert into pivot select term,term='1Q' as 1q,term='2Q' as 2q,term='3Q' as 3q,term='4Q' as 4q from tbl; 12 13/* 横方向のデータ保持 */ 14create table cols(col varchar(10)); 15insert into cols values('sales'),('budget'),('ratio'); 16
- とりあえず結合
SQL
1select 2t1.*, 3case t1.col 4when 'sales' then t2.sales 5when 'budget' then t2.budget 6when 'ratio' then t2.ratio 7end as val 8from (select * from pivot,cols) as t1 inner join 9tbl as t2 on t1.term =t2.term ;
- 上記をもとに集計
SQL
1select col 2,sum(1Q*val) as 1Q 3,sum(2Q*val) as 2Q 4,sum(3Q*val) as 3Q 5,sum(4Q*val) as 4Q 6from( 7select 8t1.*, 9case t1.col 10when 'sales' then t2.sales 11when 'budget' then t2.budget 12when 'ratio' then t2.ratio 13end as val 14from (select * from pivot,cols) as t1 inner join 15tbl as t2 on t1.term =t2.term 16) sub 17group by col; 18
※前回も下記来ましたが結果としてteamを縦に書くのはロジックとしておかしいので
やっていません。
投稿2017/07/19 11:21
編集2017/07/20 01:24総合スコア117326
0
PIVOT を利用してはいかがでしょう?
以下の記事は SQL Server の例ですが MySQL でも同様なことはできるのではないかと思います。
PIVOT の使用
http://surferonwww.info/BlogEngine/post/2010/08/07/Use-of-PIVOT.aspx
ハズレでしたらすみませんでした。
投稿2017/07/19 10:10

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