1

我正在尝试做一个简单的聚合查询来为某个日期范围内的用户汇总一些结果。我想选择所有用户,如果他们没有适当的记录,查询应该只为他们返回 0。

问题是,即使在选择用户 ID 的表上使用右外连接,它也只会选择左表的该日期范围内存在的用户......

这是查询:

select B.fld_strcode, sum(ISNULL(fld_val, 0)) as res
from tbl_transproc A right outer join tbl_pr B on A.fld_int_id = B.fld_auto_int_id
where A.fld_dtmservicedate between '2012-04-01' and '2012-05-01'
and B.fld_bytprtypeid = 1
group by B.fld_strcode

此查询返回 13 行。仅选择 ID (fld_strcode) 的查询返回 25 个唯一结果。我希望它返回 25 行(对于每个 ID),而那些没有值的行的值为 0。如果我取出日期范围(遍历表中的所有结果),那么它适用于所有用户,这这是有道理的,因为在所有时间里,所有用户都会在表中至少有一条记录。有些用户几个月都没有记录,在这种情况下,我需要它为他们返回 0。

关于如何实现这一目标的任何想法。

4

1 回答 1

3

过滤外连接时,必须记住在连接本身中进行,否则最终会得到屏蔽内连接:

select B.fld_strcode, sum(ISNULL(fld_val, 0)) as res
  from tbl_transproc A 
 right outer join tbl_pr B 
    on A.fld_int_id = B.fld_auto_int_id
   AND A.fld_dtmservicedate between '2012-04-01' and '2012-05-01'
 where B.fld_bytprtypeid = 1
 group by B.fld_strcode

我会切换表,所以我得到左连接,因为在更复杂的查询中它变得不可读,特别是如果你混合右连接和左连接,就像查询设计者喜欢做的那样。

于 2012-05-26T17:43:35.127 回答