sql - PostgreSQL 从两个表中选择空值

标签 sql postgresql select

我有问题要解决。

我有两个表,institutions 和 documents,它们通过文档 owner_id 和 institution id 连接:

机构

 id | name
----+-----
  1 | a
  2 | b
  3 | c
  4 | d

文件

   id | owner | value
  ----+-------+------
    1 |     1 | xxx
    2 |     1 | yyy
    3 |     1 | yyy
    4 |     3 | xxx
    5 |     3 | xxx
    6 |     4 | yyy

然后我需要统计,每个名字有多少个值,这样的结果:

 name | count(total) | count(xxx) | count(yyy)
------+--------------+------------+------------
 a    |            3 |          1 |          2
 b    |            0 |          0 |          0
 c    |            2 |          2 |          0
 d    |            1 |          0 |          1

我试过这个查询:

SELECT 
    a.name,
    (a.xxx + b.yyy) as total,
    a.xxx,
    b.yyy
FROM
    (SELECT count(documents.id) as xxx,
        institution.name
    FROM 
        documents, institution
    WHERE 
        documents.owner_id = institution.id and 
        documents.value = 'xxx'
    GROUP BY 
        institution.name) as a,
    (SELECT count(documents.id) as yyy,
        institution.name
    FROM 
        documents, 
        institution
    WHERE 
        documents.owner_id = institution.id and 
        documents.value = 'yyy'
    GROUP BY 
        institution.name) as b
WHERE 
a.name = b.name
ORDER BY 
a.name

但它只返回那些行,其中 xxx 和 yyy 不是 epmty,这种:

 name | count(total) | count(xxx) | count(yyy)
------+--------------+------------+------------
 a    |            3 |          1 |          2

我缺少这些行:

 name | count(total) | count(xxx) | count(yyy)
------+--------------+------------+------------
 b    |            0 |          0 |          0
 c    |            2 |          2 |          0
 d    |            1 |          0 |          1

因为它包含空数据。 提前致谢。

朱利叶斯

最佳答案

它可以更容易,试试这个解决方案

SELECT i.name,
       COUNT(*) total,
       COUNT(CASE d.value WHEN 'xxx' THEN 1 ELSE NULL END) x_cnt,
       COUNT(CASE d.value WHEN 'yyy' THEN 1 ELSE NULL END) y_cnt
FROM institution i
LEFT JOIN documents d ON d.owner = i.id
GROUP BY i.name

关于sql - PostgreSQL 从两个表中选择空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29669387/

相关文章:

php - 如何从另外两个表创建派生表?

MySQL 统计不同查询

database - 使用 Clojure 在数据库上循环

用于从其他值列相同的一列中提取值的sql查询

c# - 为什么我在 C# WinForms 到 MySQL 数据库的 SELECT 语句中出现此错误?

php - 选择不等于关联数组键的多个值的位置

mysql - 从mysql中的表中获取唯一结果

SQL Server - 将 SELECT 语句存储到存储过程中的变量中

php - 如何查看数据库的结果是否与数组中的值匹配

postgresql - 有没有一种简单的方法可以消除 tsvector 中词素的出现?