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

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

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

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Q&A

解決済

3回答

1475閲覧

ORACLEにてgroupbyで集計をしたのですが、うまくいきません。

退会済みユーザー

退会済みユーザー

総合スコア0

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

0グッド

0クリップ

投稿2016/04/28 14:34

編集2016/04/29 00:06

ORACLEのSQL集計について質問があります。
初めまして当方Oracleを学び始めた初心者なのですがデータ集計で行き止まっています。
下記の結果を出せるSQLを教えて下さりませんでしょうか?

下記の画像のようなテーブルが二つありましてそれらを結合したものがテーブルの下のものになります。

テーブル説明

これらのテーブルから最終的に
・購入日が2015/1/1~2015/1/31の期間
の区分ごとの会員人数

・購入日が2015/1/1~2015/2/28の期間
の区分ごとの会員人数

・購入日が2015/1/1~2015/4/30の期間
の区分ごとの会員人数

を集計したいのですがうまくいきません。

先にどのような結果が欲しいかといいますと下記になります。

・購入日が2015/1/1~2015/1/31の期間のもの
会員区分:会員数
0: 0
1: 0
2: 1

・購入日が2015/1/1~2015/2/28の期間のもの
の区分ごとの会員人数
会員区分:会員数
0: 0
1: 1
2: 1

・購入日が2015/1/1~2015/4/30の期間のもの
の区分ごとの会員人数
会員区分:会員数
0: 1
1: 1
2: 1

自分ではどうしても会員IDが重複してしまい下記のようになってしまいます。
下記がSQlになります。
select
会員区分、count(*)
from
会員テーブル A,
レッスン詳細テーブル B
where
A.会員ID = B.会員ID AND
B.購入日 between to_date(20150101,'YYYYMMDD') and to_date(20150131,'YYYYMMDD')
group by
A.会員区分
order by
A.会員区分;

・購入日が2015/1/1~2015/1/31の期間のもの
の区分ごとの会員人数
会員区分:会員数
0: 0
1: 0
2: 1

・購入日が2015/1/1~2015/2/28の期間のもの
の区分ごとの会員人数
会員区分:会員数
0: 0
1: 2
2: 1

・購入日が2015/1/1~2015/4/30の期間のもの
の区分ごとの会員人数
会員区分:会員数
0: 1
1: 4
2: 2

すいませんがSQLのおかしなところがあったら指摘していただけないでしょうか?
よろしくお願いします。

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

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

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

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

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

yodel

2016/04/29 02:56

会員テーブルの中身についてですが、 (1,0) (2,1) (3,2) の3レコードのみが入っている認識です。
guest

回答3

0

to_date() の第一引数は文字列にしないといけないのでは?

投稿2016/04/29 06:49

tkanda

総合スコア2425

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

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

0

会員テーブルひとつみて一意ではないし、正規化を理解されていないように思えます。
wiki リレーションの正規化
などでググって調べてください。
Oracleではマルチバイト文字をテーブル名や列名に使った時はSQLは
CREATE TABLE "会員テーブル" ("会員ID" NUMBER....
などとダブルクォーティングしないと動作保証されません。

投稿2016/05/02 10:49

Orlofsky

総合スコア16415

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

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

退会済みユーザー

退会済みユーザー

2016/05/03 14:29

ご指摘ありがとうございます。
guest

0

ベストアンサー

会員IDが重複してしまうのならば、取得結果を
会員IDでGroupByやDistinctした結果をカウントしてみてはどうでしょうか。

SQL

1select 2 会員ID,会員区分,count(*) 3from 4 会員テーブル A, 5 レッスン詳細テーブル B 6where 7 A.会員ID = B.会員ID AND 8 B.購入日 between to_date('20150101','YYYYMMDD') and to_date('20150131','YYYYMMDD') 9group by 10 A.会員ID,A.会員区分 11order by 12 A.会員区分; 13

投稿2016/04/28 22:29

編集2016/04/29 07:04
yodel

総合スコア508

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問