sql - 计算 NULL 和非 NULL 行的巧妙方法?

标签 sql postgresql

我一直在用子选择和一些聚合函数计算 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;

http://sqlfiddle.com/#!1/17a9d/15

关于sql - 计算 NULL 和非 NULL 行的巧妙方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12844637/

相关文章:

mysql - 子查询比连接运行得更快?

postgresql - 如何在 Postgres 中使用外键和关系表删除子记录

mysql - 后跟 SELECT LAST_INSERT_ID 时 INSERT 不起作用

php - 使用 foreach 循环更改查询或数据

sql - 有计数是行不通的

Postgresql:将 % 附加到数组元素的开头和结尾

spring - Spring Boot Batch 中的 Hibernate_sequence 错误(预定)

postgresql - 如何处理与 gorp 的连接?

sql - 在 PostgreSQL 中获取时间戳年份

c# - 在 SQL 中,我想从前一行日期中减去一个日期