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

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

新規登録して質問してみよう
ただいま回答率
85.46%
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

解決済

2回答

1024閲覧

distinctでcountした要素同士をクロス集計したい

shintaro1001

総合スコア7

PostgreSQL

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

SQL

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

0グッド

0クリップ

投稿2021/09/15 02:25

前提・実現したいこと

distinctでcountした要素同士をクロス集計したい

顧客ID商品頻度ランク価格ランク
0001AC
0001コーヒーAC
0001豆腐AC
0002CB
0002コーヒーCB
0002豆腐CB
0003BA
0003コーヒーBA
0003豆腐BA

上記のような集計用のテーブルを顧客IDでdistinctして件数を頻度ランクと価格ランクでクロス集計したいと考えています。
各顧客IDに対して頻度ランクと価格ランクは同じ値が入っています。(集計用にあとから顧客ID単位で更新したため)
(上記の例では顧客ID0001は3レコードありますが、頻度ランクA、価格ランクBという値は同じものが入ってます。)

イメージとしては下記のような出力をしたいです。

頻度ランクA頻度ランクB頻度ランクC
価格ランクA010
価格ランクB001
価格ランクC100

試したこと

select 頻度ランク,count(distinct 顧客id) from テーブル group by 頻度ランク select 価格ランク,count(distinct 顧客id) from テーブル group by 価格ランク

片方の要素であれば、上記のsqlでカウントできるのですが、双方をクロス集計させる方法がわかりません。

環境

Macローカルpostgresql(pgadmin)

よろしくお願いします。

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

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

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

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

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

yambejp

2021/09/15 02:55

ご提示のサンプルは普通正規化対象になりますが、この運用がマストなのでしょうか?
shintaro1001

2021/09/15 03:01

ご質問ありがとうございます。 本来は正規化して整えるべきですが、今回はスキル的、時間的な制約もあったため、その場しのぎのような形でこういう加工をしています。ご了承ください。
guest

回答2

0

ベストアンサー

やりたいことはこういうことでしょうか?

SQL

1SELECT 2 価格ランク 3, COUNT(DISTINCT CASE WHEN 頻度ランク='A' THEN 顧客ID END) AS 頻度ランクA 4, COUNT(DISTINCT CASE WHEN 頻度ランク='B' THEN 顧客ID END) AS 頻度ランクB 5, COUNT(DISTINCT CASE WHEN 頻度ランク='C' THEN 顧客ID END) AS 頻度ランクC 6FROM テーブル 7GROUP BY 価格ランク

投稿2021/09/15 03:18

takanaweb5

総合スコア358

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

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

shintaro1001

2021/09/15 04:16

ありがとうございました! 意図した結果が得られました。
guest

0

SQL

1select 価格ランク 2,case 頻度ランク when 'A' then 1 else 0 end as 頻度A 3,case 頻度ランク when 'B' then 1 else 0 end as 頻度B 4,case 頻度ランク when 'C' then 1 else 0 end as 頻度C 5 from (select distinct 価格ランク,頻度ランク from テーブル) as t1

投稿2021/09/15 03:05

yambejp

総合スコア115012

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

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

shintaro1001

2021/09/15 04:17

ありがとうございました。 顧客IDの重複があったため意図した結果にはなりませんでしたが、勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問