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 で書き換えても
似たようなものです。
何か良い案がありましたら、ご提示いただければ幸いです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/05/15 07:03
2015/05/15 07:08
2015/05/15 07:10
2015/05/15 07:15