PostgreSQL 统计同一张表的多列

Posted

技术标签:

【中文标题】PostgreSQL 统计同一张表的多列【英文标题】:PostgreSQL count multiple columns of the same table 【发布时间】:2021-03-20 11:58:50 【问题描述】:

我想从 PostgreSQL 中的一个表中计算一些列。

对于每一列计数,我都有一些条件,我想在一个查询中包含所有内容。我的问题是我没有得到预期的计数结果,因为我试图将所有条件应用于整个数据集。

桌子:

column1 column2 column3
UUID10 UUID20 UUID30
NULL UUID21 NULL
NULL UUID22 UUID31
UUID11 UUID20 UUID30

这是我迄今为止尝试过的:

SELECT
   COUNT(DISTINCT column1) AS column1_count,
   COUNT(DISTINCT column2) AS column2_count,
   COUNT(DISTINCT column3) AS column3_count
FROM TABLE
WHERE 
   column2 IN ('UUID20', 'UUID21', 'UUID22')       
   AND column1 = 'UUID10'  -> this condition should be removed from this where clause
   OR column3 IN ('UUID30', 'UUID31')

结果:

column1_count column2_count coumn3_count
2 3 2

结果不正确,因为我应该有 column1_count = 1。我的意思是,这就是查询的作用,但不是我想要的。所以我想在子查询中对 column2 和 column3 有一些约束,而对 column1 有另一个条件。

第二次尝试:

SELECT *
FROM 
(
    SELECT 
    column1
    column2,
    column3
    FROM TABLE
    WHERE  
    column2 IN ('UUID20', 'UUID21', 'UUID22') 
    OR column3 IN ('UUID30', 'UUID31')
) x
WHERE
column1 = 'UUID10'

结果:

column1_count column2_count coumn3_count
1 1 1

因为 column1 上的最后一个条件限制了我的结果,所以我最终得到了 1 的所有计数。 如何应用不同的条件来计算每一列?

如果可能的话,我会尽量不使用UNION。也许可以用另一种方式制作一些子查询,而不是我到目前为止所尝试的方式。我只需要找到一种方法来约束 column1,而不是在与 column2 和 column3 相同的WHEN 子句中。

【问题讨论】:

你想要的输出是什么? “我的意思是,这就是查询的作用,但不是我想要的。”您的问题没有解释您的意图。 【参考方案1】:

认为你想要条件聚合:

SELECT COUNT(DISTINCT CASE WHEN column1 = 'UUID10' THEN column1 END) AS column1_count,
       COUNT(DISTINCT column2) AS column2_count,
       COUNT(DISTINCT column3) AS coumn3_count
FROM TABLE
WHERE column2 IN ('UUID20', 'UUID21', 'UUID22') OR      
      column3 IN ('UUID30', 'UUID31');

我假设您知道COUNT(DISTINCT CASE WHEN column1 = 'UUID10' THEN column1 END) 不是特别有用的代码。它根据值是否存在返回 1 或 0。我认为您的代码实际上更有趣。

【讨论】:

我知道你所说的,谢谢你的回答。我试图想出一个抽象的例子来解释我的问题,但我认为你的建议很有帮助。

以上是关于PostgreSQL 统计同一张表的多列的主要内容,如果未能解决你的问题,请参考以下文章

SQL一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)

如何将数据库中一张表的多列映射到类中的一个数组/列表?

PostgreSQL:基于多列唯一约束的自增

postgresql导出某张表的数据

将数据库中的某一表中的某一列或者多列添加到另一张表的某一列中——猎八哥FLY

更新具有来自同一表的最新相关 id 的表列