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一次性查询一个字段不同条件下的统计结果(另一张表的统计数量)