【问题标题】:How to count when don't know specific types不知道具体类型时如何计算
【发布时间】:2021-07-11 18:50:53
【问题描述】:

我正在处理这样一张桌子:

id type
1 A
2 A
3 B
4 C
5 C

我想统计每种类型的id个数,得到一个这样的表。

type_a type_b type_c
2 1 2

我做的是

SELECT 
    SUM(CASE WHEN type = 'A' THEN 1 ELSE 0 END) AS type_a,
    SUM(CASE WHEN type = 'B' THEN 1 ELSE 0 END) AS type_b,
    SUM(CASE WHEN type = 'C' THEN 1 ELSE 0 END) AS type_c
FROM myTable

我的问题是,如果我不知道有多少种类型,又不能具体列出所有的情况,我该如何实现呢?

【问题讨论】:

标签: sql postgresql pivot dynamic-sql crosstab


【解决方案1】:

您正在寻找“交叉表”或“数据透视表”。我添加了标签。
然而:

如果我不知道有多少种类型,又不能具体列出所有的情况,我该如何实现呢?

基本上,这在单个 SQL 查询中不可能,因为 SQL 要求在调用时知道结果列的数量。原则上不能返回动态列数。

对于多态类型或 jsonjsonbhstorexml 等文档类型有多种解决方法,或者返回数组而不是单个列...

但要准确获得您所要求的、未知数量的专用列,您需要一个两步工作流程。喜欢:

  1. 动态构建查询(确定返回类型)。
  2. 执行它。

相关:

也就是说,如果您的情况简单并且您处理的是已知类型的手牌,您可以过度供应。使用更快的 crosstab() 查询,或者像你这样使用简单的条件聚合,使用聚合 FILTER 子句更加优雅和高效:

SELECT count(*) FILTER (WHERE type = 'A') AS type_a
     , count(*) FILTER (WHERE type = 'B') AS type_b
     , count(*) FILTER (WHERE type = 'C') AS type_c
     , count(*) FILTER (WHERE type = 'D') AS type_d
     -- that's all folks!
FROM   tbl;

没有条目的类型报告0count() 永远不会返回NULL),无论如何这都是正确的。

显然不适用于未知类型。

【讨论】:

    【解决方案2】:

    如果我理解正确的话,你想要的只是一个简单的 COUNT:

    SELECT
        type
        ,COUNT(id)
    FROM myTable
    GROUP BY type
    

    【讨论】:

    • 我还想添加一些列。例如:count、percentage 等,希望这样,对于每一列,它是一个类型,对于第一行,它是每种类型的计数,对于第二行,它是每种类型的百分比。 (百分比 = 每种类型的计数 / id 的总计数)。
    猜你喜欢
    • 2018-09-15
    • 1970-01-01
    • 2012-02-29
    • 2020-09-02
    • 2019-07-12
    • 1970-01-01
    • 2010-09-23
    • 2012-06-17
    • 1970-01-01
    相关资源
    最近更新 更多