サブセレクトといくつかの集計関数を使用して、NULL および非 NULL 列を数えています。
CREATE TEMPORARY TABLE citizens(name text, country text,profession text,postalcode text);
INSERT INTO citizens VALUES
('Fred', 'USA', 'Professor', NULL),
('Amy', 'USA', 'Professor', NULL),
('Ted', 'USA', 'Professor', 90210),
('Barb', 'USA', 'Lawyer', 10248),
('Wally', 'USA', 'Lawyer', NULL),
('Fred', 'Canada', 'Professor', 'S0H'),
('Charles', 'Canada', 'Professor', 'S4L'),
('Nancy', 'Canada', 'Lawyer', NULL),
('Linda', 'Canada', 'Professor', NULL),
('Steph', 'France', 'Lawyer', 75008 ),
('Arnold', 'France', 'Lawyer', 75008 ),
('Penny', 'France', 'Lawyer', 75008 ),
('Harry', 'France', 'Lawyer', NULL);
SELECT country,
profession,
MAX(have_postalcode::int*num) AS num_have,
MAX((1-have_postalcode::int)*num) AS num_not_have
FROM
(
SELECT country, profession,
COUNT(*) AS num,
(postalcode IS NOT NULL) AS have_postalcode
FROM citizens
GROUP BY country, profession, have_postalcode
) AS d
GROUP BY country, profession
結果とともに
USA Professor 1 2
Canada Lawyer 0 1
USA Lawyer 1 1
France Lawyer 3 1
Canada Professor 2 1
しかし、より洗練された方法があるべきだと思われます (たとえばMAX
、1 つの重要な値を取得するためだけに使用されるのは苦痛です)。誰かクールなアイデアを持っていますか?