【问题标题】:PostgreSQL - Set default value on inner with count(*)PostgreSQL - 使用计数(*)在内部设置默认值
【发布时间】:2018-01-05 12:44:57
【问题描述】:

我没有发现我的问题。我有 2 个表,例如:range(pk, min, max) 和 user(name, value),我将进行内部连接和分组以拥有:对于每个范围、每个用户、值的总和(即使没有结果)。喜欢:

range   name    value
0-10    test     2

0-10    test2    8
0-10    test3    3

0-10    test4    7
0-20    test     0 ====> actualy, i don't get this line

0-20    test2    8
0-20    test3    3

0-20    test4    7

其实我的查询是:

select cast(range.min AS CHARACTER VARYING) || '-' || cast(range.max AS CHARACTER VARYING)
    ,user.NAME
    ,count(*)
FROM range
INNER JOIN user ON user.value >= range.min
    AND user.value <= range.max
GROUP BY range.pk
    ,user.NAME
ORDER BY range.pk;

有没有人有想法在没有结果时插入 0?

编辑:我的范围永远不会为 NULL,当他不在范围内时,我只会添加用户名。

【问题讨论】:

标签: sql postgresql


【解决方案1】:

这有点令人困惑,因为有一个名为user 的表具有重复的名称。所以要么这不是用户表(每个用户有一条记录),要么我们对这里的用户并不真正感兴趣,而是对用户名感兴趣(并且多个用户可以有相同的名字)。

无论如何:当用户与范围不匹配时,您希望计数为零。这意味着您希望将所有用户与所有范围结合起来,然后进行计数。使用交叉连接执行此操作。

select
  r.min || '-' || r.max as value_range,
  u.name as user_name,
  (
    select count(*) 
    from users u2 
    where u2.name = u.name 
    and u2.value between r.min and r.max
  ) as user_range_count
from range r
cross join (select distinct name from user) u
order by r.min, r.max, u.name;

【讨论】:

  • 我会尝试,但在我的用户表上,多个用户可以有相同的名称,
  • 行得通,大坦克!!
  • 我如何在没有范围表的情况下做同样的事情? (在我的用户表上,我有一列 GENDER,未指定时为 0,男性为 1,女性为 2)
  • 那么你也应该有一个性别表。
  • 完成,我已经创建了一个临时表来回答您的问题。非常感谢
猜你喜欢
  • 2010-12-26
  • 2017-01-23
  • 1970-01-01
  • 2017-03-19
  • 2015-03-27
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 2013-11-25
相关资源
最近更新 更多