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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

Q&A

解決済

3回答

2106閲覧

SQLのGROUP BYの組み合わせに全てをいれる

txmy

総合スコア7

MySQL

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

SQL

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

1グッド

0クリップ

投稿2016/01/24 08:32

###前提・実現したいこと
SQL のGROUP BYで複数カラムを指定したときにそのカラムの項目の組み合わせすべてで集計できますが、その組み合わせに全ての集計結果を含めたいです。
わかりづらいので例をあげます。

clumn1の項目としてA,Bがあって、
clumn2の項目としてC,Dがあるとします。

SQL

1SELECT 2 clumn1, 3 clumn2, 4 COUNT(*) cnt 5FROM 6 table1 t 7GROUP BY 8 clumn1, 9 clumn2

このSQLだとclumn1とclumn2の組み合わせが
A,C
A,D
B,C
B,D
の4パターンあり、そのそれぞれのカウント数が出てくるかと思います。

ここで、
A,C
A,D
B,C
B,D
A,CD
B,CD
の下の2つのように(A,C)と(A,D)の合算値を出す項目みたいなものを出したいのですが、何か良い方法はありませんでしょうか?

ちなみにclumn2の項目C,Dは今は2つですが、実際はいくつあるかわかりませんし、カラムも2つでなくもっとたくさんあります。

よろしくお願いします。
###補足情報(言語/FW/ツール等のバージョンなど)
prestoでやってますのでできればSQL標準のものであればありがたいですが、MySQLとかPostgreSQLとかそういうのでもわかれば教えて下さい。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

DBによってはRollUpが使えます。

SQL

1SELECT clumn1,clumn2,COUNT(*) cnt 2FROM table1 t 3GROUP BY clumn1,RollUp(clumn2)

のような感じでいけるかも

投稿2016/01/29 19:51

AketiJyuuzou

総合スコア1147

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

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

txmy

2016/02/02 08:01

ありがとうございます! RollUpというものを初めて知りました。 RollUpをキーワードにして色々検索したらhiveやprestoでも同じようなことが実現できました。 愚直に何万行も組み合わせ分のコードを生成しててメモリ落ちとかに悩まされていたんですが、おかげさまですっきりとしたコードがかけました。 本当に助かりました。 ありがとうございました。
guest

0

複数種類の集計を1つのSQLで実行したいとの質問と受け取りました。

レポートとしては、そのような形式がいいかもしれませんが、私はSQLはレポートを作るには向かないと考えています。一旦集計結果をExcelに取り込みピポットテーブルで臨む形にするか、Accessで本格的にレポート形式にするのが良いと思います。

というのも、この方向ではどんどんSQLにいろいろな要件(例えば、(A, C), (A, D), (A, CD), (B ...の順で表示してほしいなど)が含まれてくる結果になるような気がしてならないのです。まあ、そうでないときもありますが・・・

投稿2016/01/24 10:53

iwamoto_takaaki

総合スコア2883

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

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

txmy

2016/01/24 11:06

回答ありがとうございます。 確かにそうなんですが、今回はビッグデータを扱うものでありまして、ExcelやAccessでは対応できず、またデータを可視化するためのBIツールとの兼ね合いで、処理の結果全パターンを一つのテーブルとして持っておく必要があるのです。 実際にはprestoやHiveなどを利用してSQLを動かします。 多少重い処理でもマシンスペックである程度は押しきれるのですが、単純に全パターンのSELECT文を書いてUNIONしていくと2^{カラム数}個のSELECT文を書くことになるのであまり現実的ではなさそうです。 GROUP BYでそのようなオプションがあったりしないか、特別な書き方がないか、探してみたのですが、見つけることができず質問した次第です。
iwamoto_takaaki

2016/01/24 11:30

>多少重い処理でもマシンスペックである程度は押しきれるのですが、単純に全パターンのSELECT文を書いてUNIONしていくと2^{カラム数}個のSELECT文を書くことになるのであまり現実的ではなさそうです。 そうですね・・・ちょっとぞっとするようなサイズですね。もし私がかけと言われたらSQLを作るプログラム作ります。 一時テーブルに集計結果をインサートする方法はどうでしょうか? 発行するsqlはunionしないので、とりあえず字数制限にはかからないし、sqlが複雑化するのもある程度抑えられると思います。 >GROUP BYでそのようなオプションがあったりしないか、特別な書き方がないか、探してみたのですが、見つけることができず質問した次第です。 私には思いつかないです。レポートを作るような機能はSQLにはほとんどないので、ないだろうなと思います。環境が許せば、集計はプログラムで作成します。
guest

0

「A,CD」「B,CD」 これはつまるところclumn1のみでグループした際のA,Bのレコード数のことだと思います。
このケースのみならclumn1でグループしたサブクエリをUNIONすれば可能かと思います。
(動作は確認してないです。)

sql

1SELECT clumn1,clumn2,COUNT(*) cnt 2FROM table1 3GROUP BY clumn1,clumn2 4 5UNION ALL 6 7SELECT clumn1, 'CD' clumn2, COUNT(*) cnt 8FROM table1 9GROUP BY clumn1

でも仮にclumn3まであってE,Fだった場合、「A(CDEF)」「A,C(EF)」「A,D(EF)」「B(CDEF)」「B,C(EF)」「B,D(EF)」の全てのケースの合計もほしいのでしょうか?またそのように動的に変化するカラムや項目に自動対応する汎用的なSQLが必要なのでしょうか?
これらの条件次第で難易度は変わると思います。

投稿2016/01/24 09:11

hirohiro

総合スコア2068

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

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

txmy

2016/01/24 10:26

ありがとうございます。 カラムは大体6~10個あって全パターン必要なのでSELECTを全通り分書くのは難しいのです。。。 SQLだけでそのように汎用的に書くことって可能なんでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問