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

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

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

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

Treasure Data

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

Q&A

解決済

2回答

2661閲覧

複数カラムの最大値のカラム名を取得する

tynko

総合スコア18

SQL

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

Treasure Data

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

0グッド

0クリップ

投稿2018/09/21 02:29

下記のようなイメージの、複数カラムの最大値を取る場合、どのようにしたらいいのでしょうか。
イメージ説明

カラムの中のポイントを取得するには、greatest関数などでできるのかとも思うのですが、
果たして、どのように、カラム名をとればいいのか、ご存知の方、ご教示いただけますと幸いです。

どうぞよろしくお願いいたします。

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

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

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

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

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

yambejp

2018/09/21 03:33

最大値が複数あった場合はどうするつもりでしょうか?greatestは要素を1つ返しますが、カラム名となると競合します
tynko

2018/09/21 03:40

最大値が複数あった場合は、、、カラムを複数作ることができるのであれば、それが良いと考えます。
tynko

2018/09/21 03:42

もしくは、どちらかを優先という形でも問題ございません。
yambejp

2018/09/21 03:52

では、最大値が競合した場合は複数を列記するものとします
guest

回答2

0

ベストアンサー

データを調整します

SQL

1create table tbl(id int,col varchar(10),val int,unique key(id,col)); 2insert into tbl values 3(111111,'CP1',5),(111111,'CP2',3),(111111,'CP3',2),(111111,'CP4',1), 4(222222,'CP1',3),(222222,'CP2',4),(222222,'CP3',5),(222222,'CP4',6), 5(333333,'CP1',1),(333333,'CP2',3),(333333,'CP3',3),(333333,'CP4',3);
  • 表示

SQL

1select id 2,sum((col='CP1')*val) as CP1 3,sum((col='CP2')*val) as CP2 4,sum((col='CP3')*val) as CP3 5,sum((col='CP4')*val) as CP4 6from tbl 7group by id

※上記mysqlのやりかたちゃんとやるなら

SQL

1select id 2,sum(case col when 'CP1' then val else 0 end) as CP1 3,sum(case col when 'CP2' then val else 0 end) as CP2 4,sum(case col when 'CP3' then val else 0 end) as CP3 5,sum(case col when 'CP4' then val else 0 end) as CP4 6from tbl 7group by id

最大値のカラム名

SQL

1select id 2,sum((col='CP1')*val) as CP1 3,sum((col='CP2')*val) as CP2 4,sum((col='CP3')*val) as CP3 5,sum((col='CP4')*val) as CP4 6,(select group_concat(col) from tbl where val= max(t1.val) and id=t1.id) as MAX_CP 7from tbl as t1 8group by id

※mysql以外のgroup_concatは適宜そのSQLの文法に合わせてください

投稿2018/09/21 03:50

yambejp

総合スコア114779

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

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

tynko

2018/09/21 03:58 編集

ありがとうございます。正規化処理をしたことがなく、基本的な質問で恐縮なのですが、 データ調整の "(111111,'CP1',5),(111111,'CP2',3),(111111,'CP3',2),(111111,'CP4',1), (222222,'CP1',3),(222222,'CP2',4),(222222,'CP3',5),(222222,'CP4',6), (333333,'CP1',1),(333333,'CP2',3),(333333,'CP3',3),(333333,'CP4',3);" の部分に関しては、全レコード分を実施するということになるのでしょうか?
yambejp

2018/09/21 04:20

select * from tbl とすると基本のデータ構造がわかります その上で「表示」に書いたものが命題を表示するSQLです tynkoさんが列記しているデータの箇所はあくまでinsertして 元データをつくるためのものです
tynko

2018/09/21 04:29

ありがとうございます!! プログラミングをはじめて間もないこともあり、yambejpさんのおっしゃることを理解しかねている状態です>< が、ひとまず上のデータ調整をやってみます。お忙しい中ありがとうございます!
guest

0

ぱっと思いつくのは、greatest()で取得した値を、case式で比較して一致したカラム名を判定する。
しかし、そうゆう用途があるなら正規化すればもっと楽に取得できますね。

投稿2018/09/21 03:01

sazi

総合スコア25173

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

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

tynko

2018/09/21 03:32

さっそくありがとうございます。 ここでおっしゃっていただいている、正規化すればということはどのようなイメージになるのでしょうか? お手数おかけし恐縮ですが、ご教示いただけましたら幸いです。
sazi

2018/09/21 03:54

yambejpさんが回答中で示されているテーブル構造が正規化されたものです。
tynko

2018/09/21 07:32

ありがとうございます。ちなみに、greatest()でやる場合、「case式で比較して一致したカラム名を判定する。」といった処理はどのような処理になるのでしょうか?正規化に少してこずっていることもあり、 greatest()で実施し、nullだらけになってしまい、array_max(filter(ARRAY でなんとか最大のポイント数は導くところまでたどり着けました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問