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

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

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

2780閲覧

自己結合の結果を合計値でソートしたい

hotta

総合スコア1613

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グッド

1クリップ

投稿2015/05/15 06:50

PostgreSQL 8.4 を利用中で、以下のようなテーブルがあるとします。

lang

1DROP TABLE IF EXISTS logs; 2CREATE TABLE logs ( 3 printer TEXT, -- プリンタ名 4 account TEXT, -- アカウント名 5 color BOOL, -- true:color false:mono 6 face INT -- 印刷面数 7); 8INSERT INTO logs(printer, account, color, face) VALUES 9( 'PR1', 'a01', true, 10 ), 10( 'PR2', 'a01', true, 10 ), 11( 'PR1', 'a02', false, 20 ), 12( 'PR1', 'a02', true, 30 ), 13( 'PR1', 'a03', true, 15 ), 14( 'PR2', 'a04', false, 5 );

これに対して、以下の様なクエリーを発行します。

lang

1SELECT 2 account 3 , color_faces -- カラー面数 4 , mono_faces -- モノクロ面数 5 , color_faces + mono_faces AS total_faces 6FROM ( 7 SELECT 8 account , 9 sum(face) AS color_faces 10 FROM 11 logs 12 WHERE 13 color -- カラーのみ 14 GROUP BY account 15) color_logs 16FULL JOIN ( 17 SELECT 18 account , 19 sum(face) AS mono_faces 20 FROM 21 logs 22 WHERE 23 NOT color -- カラー以外 24 GROUP BY account 25) mono_logs 26USING (account) 27ORDER BY total_faces DESC;

lang

1 account | color_faces | mono_faces | total_faces 2---------+-------------+------------+------------- 3 a01 | 20 | | 4 a03 | 15 | | 5 a04 | | 5 | 6 a02 | 30 | 20 | 50 7(4 行)

本来は a02 が先頭に来るべきですが、カラーとモノクロのいずれかしか
使っていないユーザは片方が NULL になり、合計も NULL になります。
NULL + 数値は NULL のようなので、足し算が機能しません。

無理やり

lang

1coalaesce(color_faces, 0) + coalaesce(mono_faces, 0) AS total_faces,

などと書き換えようとしても、

lang

1ERROR: 関数coalaesce(bigint, integer)は存在しません 2行 5: coalaesce(color_faces, 0) + coalaesce(mono_faces, 0) AS... 3 ^ 4HINT: 指定名称、指定引数型に合う関数がありません。明示的な型キャストが必要かもしれません

と怒られます。color_faces を INT に cast してもだめで、CASE で書き換えても
似たようなものです。

何か良い案がありましたら、ご提示いただければ幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

未テストです。
以下でどうでしょう。

lang

1SELECT 2 account 3 , SUM(CASE WHEN color THEN face ELSE 0 END) AS color_faces -- カラー面数 4 , SUM(CASE WHEN NOT color THEN face ELSE 0 END) AS mono_faces -- モノクロ面数 5 , SUM(face) AS total_faces 6FROM 7 logs 8GROUP BY account 9ORDER BY total_faces DESC; 10

投稿2015/05/15 07:01

編集2015/05/15 07:02
kantomi

総合スコア295

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

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

kantomi

2015/05/15 07:03

NULLで出力したいときは、 CASE WHEN color THEN face ELSE NULL END にしてください。
kantomi

2015/05/15 07:08

因みに、元のSQLなら、 , color_faces + mono_faces AS total_faces を COALESCE(color_faces, 0) + COALESCE(mono_faces , 0) AS total_faces とすれば動くと思いますが……。
kantomi

2015/05/15 07:10

coalaesce(color_faces, 0) + coalaesce(mono_faces, 0) AS total_faces スペルミス(aが多い)だから怒られているみたいですよ。
hotta

2015/05/15 07:15

魔法のようです。 最初の案を採用させていただきました。感謝します。 # スペルミス、、、質問に初心者ラベルをつけるべきでした(*_*)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問