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

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

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

591閲覧

postgresqlでgroup byしたクエリをgroup byしたい

nikoniko

総合スコア11

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/12/06 06:12

編集2021/12/06 06:24

メール送信履歴を管理するテーブルで、メール1通につき、1レコードが作成されます。

このテーブルから店舗ごとの日次件数を取得したいのですが、方法がわかりません。

お教えいただけますでしょうか?

email_history

email_history

1id numeric not null primary_key 2shop_id numeric 3message text 4created_date timestamp

shop

1shop_id numeric not null primary_key 2name text

試したこと

with s as(select count(*), shop_id, created_date from email_history group by shopid) select count(*) from s group by created_date;

出現したエラー

column "created_date" must appear in the group by clause or be used in an aggregate function

created_dateをgroup byに含めてくださいと言っているのはわかったのですが
どのようにしたらよいのかわからず、お詳しい方、お教えくださいm(_ _)m

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

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

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

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

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

takanaweb5

2021/12/06 07:07

created_dateはtimestamp型ですが時刻情報を持っていないのですか? 実質date型として使用しているのですか? 時刻情報を持っているのであれば、日付単位にまとめるgroup byが必要と思われます。
guest

回答3

0

sql

1SELECT 2 shop_id 3, created_date::date 4, count(*) as 件数 5FROM email_history 6GROUP BY 7 shop_id 8, created_date::date

created_dateはtimestamp型なので日付単位にまとめています

投稿2021/12/06 12:23

takanaweb5

総合スコア359

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

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

0

created_dateをgroup byに含めてくださいと言っているのはわかったのですが

まずは、select count(*), shop_id, created_date from email_history group by shopid を動くようにしてみてはいかがかと。

投稿2021/12/06 06:22

shiketa

総合スコア4061

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

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

nikoniko

2021/12/06 06:27

まずは、店舗ごとの件数の取得方法ありがとうございます。日次と店舗両方で絞った件数の取り方が知りたく、困っております。もう少し調べてみます!
guest

0

sql

1with s as(select count(*), shop_id, created_date from email_history group by shopid) 2select count(*) from s group by created_date;

sql

1with s as ( 2 select count(*), shop_id, created_date from email_history group by shopid, created_date 3) 4select count(*) from s group by created_date;

sの定義の中のgroup by句にないものは、集約関数count()と並べられないかと思います。

投稿2021/12/06 06:21

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

nikoniko

2021/12/06 06:46

コメントありがとうございます! なるほど、group by句にcreated_dateがないから怒られていたのですね…。 ただ、sをshop_idとcreated_dateでgroup byしてしまうと、 [RECORD 1] count | 1 [RECORD 2] count | 1 [RECORD 3] count | 1 ……… のように全部1件になってしまいます。 私の元々のsqlがわるかったのですが こんなイメージで取得したいです。 日にちでSUMしないといけないのかな… [RECORD 1] shopid | 1 created_date | 2021-12-01 count | 100 [RECORD 2] shopid | 1 created_date | 2021-12-02 count | 10 [RECORD 3] shopid | 3 created_date | 2021-12-01 count | 20 [RECORD 3] shopid | 3 created_date | 2021-12-02 count | 10
shiketa

2021/12/06 06:58

> のように全部1件になってしまいます。 `select count(*) from s group by created_date`を`select * from s`とすればいい。つまり、with句を使う必要も意味もない、ということ。
退会済みユーザー

退会済みユーザー

2021/12/06 07:50

サンプルデータもない中で想像を巡らせるのは難しいですね。 第三者が再現しやすいよう、サンプルデータとともに、手計算によるほしい結果の形もあると、良いかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問