我一直在用子选择和一些聚合函数计算 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
仅用于获取一个非平凡的值,这让我很痛苦)。有人有什么好主意吗?
最佳答案
SELECT country, profession,
COUNT(postalcode) AS num_have
, (COUNT(*) - COUNT(postalcode)) AS num_not_have
FROM citizens
GROUP BY country, profession;
关于sql - 计算 NULL 和非 NULL 行的巧妙方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12844637/