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

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

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

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

SQL

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

Q&A

解決済

2回答

8476閲覧

SQLで縦横変換して取得する方法を教えてください。

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

SQL

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

0グッド

0クリップ

投稿2016/11/14 02:31

下記のテーブルを縦横変換して取得したいです。

personテーブル no |name |date |weight ---+--------+--------+------- 1 |tanaka |2015/4 |60 1 |tanaka |2016/4 |62 2 |yamada |2014/4 |61 2 |yamada |2015/4 |66 2 |yamada |2016/4 |64

↓こう取得したい

personテーブル no |name |2014/4 |2015/4 |2016/4 ---+--------+--------+--------------- 1 |tanaka | |60 |62 2 |yamada |61 |66 |64

日付カラムの値をカラムに使用したいです。

決め打ちで指定してピボットをかける方法が紹介されている記事を拝見しました。
dateカラムに入ってくる値が固定であればその方法を使用できるのですが、
不定な値が入ってくるためあてはめることができませんでした。

どなたか方法をご存知の方教えていただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

  • プロシージャで処理する
  • ピボットテーブルを任意に作成して処理する
  • プログラムで一度日付データだけ抜き出し、SQL文を作成する
  • 冗長なデータをプログラムで整形する

のいずれかが妥当です

sample

もし日付を先に抜き出して集計表を作る場合は以下のようになります

  • 元データ

SQL

1create table person(no int,d date,weight double); 2insert into person values(1,'2015-04-01',60),(1,'2016-04-01',62),(2,'2014-04-01',61),(2,'2015-04-01',66),(2,'2016-04-01',64);
  • 日付抜き出し

SQL

1select distinct d from person order by d asc;
  • 集計表

SQL

1select no 2,sum(weight*(d='2014-04-01')) as `2014-04-01` 3,sum(weight*(d='2015-04-01')) as `2015-04-01` 4,sum(weight*(d='2016-04-01')) as `2016-04-01` 5from person 6group by no

※sum・・・の箇所をプログラム吐き出します

投稿2016/11/14 02:46

編集2016/11/14 03:38
yambejp

総合スコア116443

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

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

退会済みユーザー

退会済みユーザー

2016/11/14 03:09

日付だけ抜き出してみます。
退会済みユーザー

退会済みユーザー

2016/11/14 07:36

教えていただいたサンプルで無事動きました。 当初は「sum要らないじゃん」と思っていたのですが、なるほどでした。 ありがとうございます。
guest

0

SQLで縦データを横に変換する方法はないですよ。

日付ごとに単純に処理をしたいのであれば、
日付でソートしてその結果をループするのが良いと思います。
(ブレイク条件を日付にする)

投稿2016/11/14 02:37

himakuma

総合スコア952

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

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

退会済みユーザー

退会済みユーザー

2016/11/14 02:41

そんな。。
himakuma

2016/11/14 02:47

自分も同じ状態に何度もあっていますが、エクセルの入れ替えみたいなことはできないですorz。現状のデータでどう処理するかを考えたほうが良いですね。画面の表示であればループの方式を考えればいけますよ。
himakuma

2016/11/14 02:50

日付ごとにSQLを発行するのだけは回避してください。性能がひどくなります。
退会済みユーザー

退会済みユーザー

2016/11/14 02:52

sqlを二回に分けてみます。一旦日付たちを取得すれば決め打ちでsqlを投げることができそうだなと。
himakuma

2016/11/14 04:03

GROUP BYで日付を取得して、SQL生成という感じですかね? それであれば日付にインデックスをつけることをお勧めします。
退会済みユーザー

退会済みユーザー

2016/11/14 07:33

インデックスについて知識が全くありません。。もう少し勉強します。 ありがとうございます。
himakuma

2016/11/14 07:39

entityやbeanを使用して、オブジェクトをレコードとして受け取るような実装をしている場合、動的にすることでより、メンドクサイことにならないように気をつけてください。リフレクションするぐらいなら動的にしない方がいいです。
himakuma

2016/11/14 07:40

PHPとかの型が固定でない場合は問題ないですが。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問