1

嘿伙计们,所以我有这份报告,我将其分组到不同的年龄段。如果没有与此年龄桶关联的行,我希望年龄桶的计数为零。所以我在我的数据库选择中做了一个外部连接,效果很好。但是,我需要根据数据库中的另一列添加一个组。

当我添加这个组时,没有与之关联的行的年龄桶消失了。我认为这可能是因为我试图分组的列对于该行是空的,所以我在我的选择中添加了一个行号,然后按它分组(我基本上只需要按每一行分组,我可以'不只是把它放在细节中......如果需要,我可以对此进行更多解释)。但是在添加行号之后,没有数据的agebuckets仍然为空!当我删除我添加的这个组时,我会得到所有年龄桶。

有任何想法吗?谢谢!!

4

2 回答 2

2

这是因为与年龄组的外部连接也不是与其他组的外部连接 - 您只能保证每个数据集的每个年龄组都有一个,而不是每个 [其他组] 的每个年龄组都有一个。

因此,例如,如果您的另一个组是区域,您需要从您的年龄范围表到区域表的笛卡尔/交叉连接(以便您获得年龄范围和区域的所有可能组合),然后再外部连接到其余组你的数据集。

编辑 - 根据评论,如下查询应该有效:

select date_helper.date_description, c.case_number, e.event_number
from 
(select 0 range_start, 11 range_end, '0-10 days' date_description from dual union
 select 11, 21, '11-20 days' from dual union  
 select 21, 31, '21-30 days' from dual union  
 select 31, 99999, '31+ days' from dual) date_helper
cross join case_table c
left outer join event_table e
on e.event_date <= date_helper.range_start*-1 + sysdate 
and e.event_date > date_helper.range_end*-1 + sysdate
and c.case_number = e.case_number

(假设需要将 event_date 分组到桶中。)

于 2010-10-25T09:58:55.397 回答
1

我很难理解你的问题。

我知道 Crystal Reports 的 NULL 支持在一些非常基本的方面缺乏支持。所以我通常尽量不依赖它。

解决此问题的一种方法是在数据库查询中硬编码年龄范围,例如:

  SELECT p.person_type
         , SUM(CASE WHEN 
               p.age <= 2 
               THEN 1 ELSE 0 END) AS "0-2"
         , SUM(CASE WHEN 
               p.age BETWEEN 2 AND 18 
               THEN 1 ELSE 0 END) AS "3-17"
         , SUM(CASE WHEN 
               p.age >= 18 
               THEN 1 ELSE 0 END) AS "18_and_over"
    FROM person p
GROUP BY p.person_type

这样你肯定会在你想要零的地方得到零。

我意识到这不是您问题的直接答案。祝你好运。

于 2010-10-22T21:51:41.203 回答