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

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

解決済

1回答

962閲覧

SQLでCUBE()関数を使って取得した合計行の名前変更

hideki.

総合スコア31

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/07/15 06:56

前提・実現したいこと

検査結果を曜日ごとに集計するQueryを作成しています。
色々なサイトを参考にしてほぼ望み通りのものを作成できましたが、どうしてもうまくいかない部分があります。

発生している問題・エラーメッセージ

テーブルのカラムは
inspected_at Timestamp型(検査日時)
judge 可変長文字列型(良品は'0'、不良品は'0'以外)
です(質問のため単純化)。

これに対してやりたいことは曜日ごとの
1.不良件数
2.良品件数
3.検査件数(1+2の件数)
を取得です。

該当のソースコード

SQL

1SELECT 2 CASE WHEN judge <> '0' THEN '不良数' ELSE '良品数' END, 3 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 0 THEN 1 ELSE 0 END) AS "日曜", 4 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 1 THEN 1 ELSE 0 END) AS "月曜", 5 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 2 THEN 1 ELSE 0 END) AS "火曜", 6 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 3 THEN 1 ELSE 0 END) AS "水曜", 7 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 4 THEN 1 ELSE 0 END) AS "木曜", 8 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 5 THEN 1 ELSE 0 END) AS "金曜", 9 SUM(CASE EXTRACT(dow FROM inspected_at) WHEN 6 THEN 1 ELSE 0 END) AS "土曜" 10FROM tbl_inspect_his_img 11WHERE 12 inspected_at BETWEEN '2020-07-01' AND '2020-07-31' 13GROUP BY CUBE(judge<> '0') 14ORDER BY judge<> '0' 15;``` 16 17### 試したこと 18これを実行すると下図の結果が得られます。 19![イメージ説明](e9aada0e704f154f80e074fb80ac5e3c.png) 20 21数字は合っているのですが、改良したい点は 221.3行目の最初のカラムを'検査数'とする 232.最初のカラム名も'件数'に設定 24です。後者はSELECT句の最初で「AS '件数'」としましたが、エラーで 25実行できませんでした。 26 27もっと、効率的なやり方もあれば、ご教示ください。 28以上、よろしくお願いします。 29 30### 補足情報(FW/ツールのバージョンなど) 31PostgreSQL 10

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

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

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

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

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

guest

回答1

0

ベストアンサー

例えば以下のようにするのはどうでしょうか?

SQL

1SELECT 2 COALESCE(区分, '検査数') AS 件数, 3 COUNT(*) FILTER (WHERE 曜日 = 0) AS 日曜, 4 COUNT(*) FILTER (WHERE 曜日 = 1) AS 月曜, 5 COUNT(*) FILTER (WHERE 曜日 = 2) AS 火曜, 6 COUNT(*) FILTER (WHERE 曜日 = 3) AS 水曜, 7 COUNT(*) FILTER (WHERE 曜日 = 4) AS 木曜, 8 COUNT(*) FILTER (WHERE 曜日 = 5) AS 金曜, 9 COUNT(*) FILTER (WHERE 曜日 = 6) AS 土曜 10FROM ( 11 SELECT 12 CASE WHEN judge = '0' THEN '良品数' ELSE '不良数' END AS 区分, 13 EXTRACT(dow FROM inspected_at) AS 曜日 14 FROM tbl_inspect_his_img 15 WHERE inspected_at BETWEEN '2020-07-01' AND '2020-07-31' 16) T 17GROUP BY CUBE(区分) 18ORDER BY position(区分 IN '良品数,不良数,検査数')

なおSELECT節でCOUNT(*) FILTER (WHERE 曜日 = 0)としましたが、これはSUM(CASE WHEN 曜日 = 1 THEN 1 END)でも問題ありません。むしろ移植性などを考えるとSUMを使ったほうがよいかもです。

投稿2021/07/15 14:17

neko_the_shadow

総合スコア2349

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

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

hideki.

2021/07/15 23:57

回答ありがとうございます。 バッチリでした。 全く知らなかったCOALESCE()関数:  与えられた引数のうち、NULLでない最初の引数を返す の実際の使い方も勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問