【问题标题】:Get the sum of (count(column1) + count(column2))得到 (count(column1) + count(column2)) 的总和
【发布时间】:2021-12-14 00:31:37
【问题描述】:

我有一张桌子 A:

entity_id    name
------------------
1            Test1
2            Test2
3            Test3
4            Test4
5            Test5
6            Test6

我有一张桌子 B:

entity_id   value1     value2
-----------------------------
1           10          20
1           15          30
2           10          25
1           9           45
3           null        1
2           45          50
3           20          null

我需要编写一个查询来从表 A 中选择 entity_id 和 name,并计算表 B 中列 value1 和 value2 的 entity_id 的总出现次数,然后计算这些列的总数(null 不计算在内) .

所以我的输出表是:

entity_id    name         value1_count    value2_count     total_count
----------------------------------------------------------------------
1            Test1             3               3              6
2            Test2             1               2              3
3            Test3             1               1              2
4            Test4             0               0              0
5            Test5             0               0              0
6            Test6             0               0              0

我无法将 value1 的计数和 value2 的计数相加,并将该值输出到每个唯一 entity_it 的 total_count 中。

这是我目前的查询:

SELECT DISTINCT a.entity_id, a.name
     , count(b.value1) AS value1_count, count(b.value2) AS value2_count, sum(2) AS total_count
FROM a
LEFT JOIN b ON a.entity_id = b.entity_id
GROUP BY a.entity_id, a.name

我知道sum(2) as total_count 不正确,没有得到我想要的。

【问题讨论】:

  • value1_count 实体 2 应该是 2,而不是 1 我假设?

标签: sql postgresql count left-join


【解决方案1】:

试试这个:

WITH list AS
(
SELECT b.entity_id
     , count(*) FILTER (WHERE b.value1 IS NOT NULL) OVER () AS value1_count
     , count(*) FILTER (WHERE b.value2 IS NOT NULL) OVER () AS value2_count
FROM Table_B AS b
GROUP BY b.entity_id
)
SELECT a.entity_id, a.name
     , COALESCE(l.value1_count, 0)
     , COALESCE(l.value2_count,0)
     , COALESCE(l.value1_count + l.value2_count, 0) AS total_count
FROM Table_A AS a
LEFT JOIN list AS l
ON a.entity_id = l.entity_id

【讨论】:

    【解决方案2】:
    SELECT entity_id, a.name
         , COALESCE(b.v1_ct, 0) AS value1_count
         , COALESCE(b.v2_ct, 0) AS value2_count
         , COALESCE(b.v1_ct + b.v2_ct, 0) AS total_count
    FROM   a
    LEFT   JOIN (
       SELECT entity_id, count(value1) AS v1_ct, count(value2) AS v2_ct
       FROM   b
       GROUP  BY 1
       ) b USING (entity_id);
    

    db小提琴here

    先聚合,后加入。这更简单,更快捷。见:

    count() 永远不会产生NULL。只有LEFT JOIN 可以在此查询中引入NULL 计数值,因此v1_ctv2_ct 要么都是NULL,要么都是NOT NULL。因此COALESCE(v1_ct + v2_ct, 0) 可以。 (否则,一个 NULL 将使加法中的另一个和数无效。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-14
      • 2013-08-11
      • 2017-08-05
      • 2012-05-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多