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

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

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

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Treasure Data

Treasure Dataは、米国トレジャーデータ社の提供するクラウド型のデータマネジメントサービスです。ビッグデータ処理システムを備え、AWS上にセットアップされているため、データの集収、保管、分析を容易に行うことができます。

TreasureData

TreasureDataは、クラウド型データマネージメントサービスです。アプケーションログやセンサーデータといった時系列データの収集や保管、分析を容易に行うことが可能です。分析エンジンとしてPrestoの利用もでき、SQLで収集データをインタラクティブに分析できます。

Q&A

4回答

5545閲覧

SQLで縦横を変換したい

mo102u

総合スコア17

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Treasure Data

Treasure Dataは、米国トレジャーデータ社の提供するクラウド型のデータマネジメントサービスです。ビッグデータ処理システムを備え、AWS上にセットアップされているため、データの集収、保管、分析を容易に行うことができます。

TreasureData

TreasureDataは、クラウド型データマネージメントサービスです。アプケーションログやセンサーデータといった時系列データの収集や保管、分析を容易に行うことが可能です。分析エンジンとしてPrestoの利用もでき、SQLで収集データをインタラクティブに分析できます。

0グッド

0クリップ

投稿2017/07/19 09:59

編集2017/07/19 12:16

下記の変更前テーブルから変更後テーブルへ変換できるSQLを書きたいのですが、
書き方が分からず、止まってしまっています。

おわかりの方、お知見を拝借させていだだけませんでしょうか。
よろしくお願い致します。

変更前テーブル

termteamsalesbudgetratio
1QteamA1002000.5
2QteamA1003000.3333
3QteamA1003000.3333
4QteamA1002000.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ページで確認できます。

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

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

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

guest

回答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

5TB

総合スコア8

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

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

0

テーブルのアイテム(項目名)をデータにするのですか?
データは上記の4件のみですか?
まさかcreate tableから作るんでしょうか?

投稿2017/07/19 11:56

maiko0318

総合スコア876

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

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

mo102u

2017/07/19 12:15

変更前データを作成する別途テーブルが存在します。 実データは4件のみではありません。 create_dataのカラムデータを元に四半期ごとに合算した変更前データを作成しています。
guest

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
yambejp

総合スコア114843

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

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

mo102u

2017/07/19 12:18

実データはTreasureData内にあるため、Prestoを使用しています。 その内容を元にご回答いただけそうでしたら、何卒よろしくお願い致します。
yambejp

2017/07/20 02:58

追記してあるとおり、pivotテーブル自体はありきたりの考え方なので その実装は容易だとおもいます
guest

0

PIVOT を利用してはいかがでしょう?

以下の記事は SQL Server の例ですが MySQL でも同様なことはできるのではないかと思います。

PIVOT の使用
http://surferonwww.info/BlogEngine/post/2010/08/07/Use-of-PIVOT.aspx

ハズレでしたらすみませんでした。

投稿2017/07/19 10:10

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

SVC34

2017/07/19 10:21

pivotはSQL Server独自の機能です
退会済みユーザー

退会済みユーザー

2017/07/19 10:53

それは失礼しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問