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

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

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

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

Q&A

解決済

2回答

3771閲覧

購買履歴を顧客IDごとにsumで集計した結果を顧客マスタにある都道府県でカウントしてクロス集計したい

shintaro1001

総合スコア7

SQL

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

0グッド

1クリップ

投稿2021/10/04 18:28

下記のような顧客マスタと購買履歴があり、購買履歴を顧客IDごとにsumで集計した結果を顧客マスタにある都道府県でクロス集計したいです。

顧客マスタ
|顧客ID|都道府県|氏名|…|
|:--|:--:|--:|
|001|東京都|山田太郎|…|
|002|大阪府|鈴木一郎|…|
|003|北海道|佐藤華子|…|

購買履歴
|顧客ID|購入日|金額|…|
|:--|:--:|--:|
|001|2021/1/1|1000|…|
|001|2021/1/2|2000|…|
|002|2021/1/1|1500|…|
|002|2021/1/2|2500|…|
|003|2021/1/1|1200|…|
|003|2021/1/2|1000|…|

購買履歴を顧客IDでグループ化するところまではできました。

sql

1select 顧客ID,sum(金額) 2from 購買履歴 3group by 顧客id order by 顧客id; 4

顧客ID合計金額
0013000
0024000
0032200

これを合計金額を範囲別に顧客マスタにある都道府県と件数としてクロス集計したいのですが、下記のSQLでは

sql

1select 都道府県 2,sum(case when sum(金額) >= 3000000 then 1 else 0 end) as "300万以上" 3,sum(case when sum(金額) >= 2000000 then 1 else 0 end) as "200万以上" 4,sum(case when sum(金額) >= 1000000 then 1 else 0 end) as "100万以上" 5,sum(case when sum(金額) >= 500000 then 1 else 0 end) as "50万以上" 6,sum(case when sum(金額) >= 200000 then 1 else 0 end) as "20万以上" 7,sum(case when sum(金額) < 200000 then 1 else 0 end) as "20万未満" 8from 購買履歴 left outer join 顧客マスタ on 顧客マスタ.顧客ID = 購買履歴.顧客id 9group by 顧客id,都道府県 order by 顧客id 10

下のエラーになってしまいます。

aggregate function calls cannot be nested

得たい結果としては下記のようになります。(単位は人)
|都道府県|300万以上|200万以上|100万以上|…|
|:--|--:|--:|--:|
|北海道|150|253|567|…|
|青森|222|678|780|…|
|岩手|242|198|345|…|
|宮城|888|876|323|…|

#環境
macローカル PostgreSQL 13.4(pgadmin4)
レコード数は
顧客マスタ:約130万行
購買履歴:約240万行
です。

ご教示いただけないでしょうか。

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

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

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

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

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

guest

回答2

0

ベストアンサー

aggregate function calls cannot be nested

select 都道府県
,sum(case when sum(金額) >= 3000000

sum関数のネストがエラーの原因ですね。
クエリを多段にして、階層ごとに集計を実施すればいいでしょう。

SQL

1SELECT x.都道府県 2 , sum(y.over300) _300万以上 3 , sum(y.over200) _200万以上 4 , sum(y.over100) _100万以上 5 , sum(y.over50) _50万以上 6 , sum(y.over20) _20万以上 7 , sum(y.under20) _20万未満 8FROM 顧客マスタ x 9JOIN 10( 11 SELECT 顧客ID 12 , case when sum(金額) >= 3000000 then 1 else 0 end over300 13 , case when sum(金額) >= 2000000 then 1 else 0 end over200 14 , case when sum(金額) >= 1000000 then 1 else 0 end over100 15 , case when sum(金額) >= 500000 then 1 else 0 end over50 16 , case when sum(金額) >= 200000 then 1 else 0 end over20 17 , case when sum(金額) < 200000 then 1 else 0 end under20 18 FROM 購買履歴 19 GROUP BY 顧客ID 20) y 21USING (顧客ID) 22GROUP BY x.都道府県;

投稿2021/10/04 22:12

mayu-

総合スコア335

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

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

shintaro1001

2021/10/05 02:31

mayu-さま いつもありがとうございます。 示していただいたサンプルを実際のテーブル、カラム名に変えて実行してみたものの、 column "顧客id" specified in USING clause does not exist in left table というエラーになってしまいました。 最初の質問の際に書きそびれていたのですが、「顧客ID」のカラム名が顧客マスタと購買履歴テーブルで異なっているのですが、そのせいでしょうか? 自分でいくつか試してみたもののうまくいかないため、ご教示いただけますと幸いです。
shintaro1001

2021/10/05 06:44

sazi様 ありがとうございます! onに書き換えて、結合するカラムを指定したら結果が得られました。
guest

0

解決済みですが、shintaro1001 さんがチャレンジされた方法に近い実現方法を紹介します。

sql

1create view 顧客別売上 as 2select 顧客ID,sum(金額) AS 金額 3from 購買履歴 4group by 顧客id; 5 6select a.都道府県 7,sum(case when z.金額 >= 3000000 then 1 else 0 end) as "300万以上" 8,sum(case when z.金額 between 2000000 and 2999999 then 1 else 0 end) as "200万以上" 9,sum(case when z.金額 between 1000000 and 1999999 then 1 else 0 end) as "100万以上" 10,sum(case when z.金額 between 500000 and 999999 then 1 else 0 end) as "50万以上" 11,sum(case when z.金額 between 200000 and 499999 then 1 else 0 end) as "20万以上" 12,sum(case when z.金額 < 200000 then 1 else 0 end) as "20万未満" 13from 顧客別売上 as z left outer join 顧客マスタ as a on z.顧客ID = a.顧客id 14group by a.都道府県

余計な補足ですが、200万以上のところに表示したいのは、200万以上300万未満の値ではないでしょうか?

投稿2021/10/05 12:38

takanaweb5

総合スコア358

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問