PostgreSQL - 在内部设置默认值count(*)

时间:2018-01-05 12:44:58

标签: sql postgresql

我对我的问题一无所知。我有2个表,如:range(pk,min,max)和user(名称,值),I' ll内连接和分组依次:对于每个范围,每个用户,值的总和(即使在那里)没有结果)。喜欢:

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,我只会在他不在范围内时添加用户名。

1 个答案:

答案 0 :(得分: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;