【问题标题】:Postgres totals by classification per group每个组按分类的 Postgres 总数
【发布时间】:2020-12-23 16:35:20
【问题描述】:

例如,我有一个带有分类列的订单表。我想获取特定日期的某个州每个城市的每个分类的总数。

我已经完成了以下工作。

SELECT
       state.id                                             AS state_id,
       state.name                                           AS state_name,
       city.id                                                    AS city_id,
       city.name                                                  AS city_name,
       count(*)                                                            AS total,
       count(CASE WHEN o.classification = 'A' THEN 1 END) AS total_A,
       count(CASE WHEN o.classification = 'B' THEN 1 END) AS total_B,
FROM orders AS o
         LEFT JOIN city ON o.city_id = city.id             
         LEFT JOIN state ON city.state_id = state.id
WHERE o.category = 'CATEGORY'
  AND o.city_id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
   AND (o.trn_date::date = '2020-05-07')
GROUP BY state.id, state.name, city.id, city.name
ORDER BY state.name, city.name;

问题是我并不总是得到 in 子句中指定的相同数量 (16) 的城市。

即使某些记录全部为零,我如何才能始终获得 16 条记录

【问题讨论】:

  • edit您的问题(通过点击下面的edit链接)并添加一些示例数据和基于该数据的预期输出为formatted text .请参阅here,了解有关如何创建漂亮的文本表格的一些提示。 (edit 您的问题 - 在 cmets 中邮政编码或其他信息)

标签: sql postgresql join count aggregate-functions


【解决方案1】:

您需要更改联接顺序,将orders 条件移动到left join,并在count() 列上使用filter 表达式。

SELECT state.id    AS state_id,
       state.name  AS state_name,
       city.id     AS city_id,
       city.name   AS city_name,
       count(*) FILTER (WHERE o.city_id IS NOT NULL) AS total,
       count(*) FILTER (WHERE o.classification = 'A') AS total_A,
       count(*) FILTER (WHERE o.classification = 'B') AS total_B
  FROM state 
       JOIN city on city.state_id = state.id
       LEFT JOIN orders AS o
              ON o.city_id = city.id             
             AND o.category = 'CATEGORY'
             AND o.trn_date::date = '2020-05-07'
 WHERE city.id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16)
 GROUP BY state.id, state.name, city.id, city.name
 ORDER BY state.name, city.name;

【讨论】:

    猜你喜欢
    • 2020-01-08
    • 1970-01-01
    • 1970-01-01
    • 2021-10-07
    • 2023-01-12
    • 2022-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    相关资源
    最近更新 更多