2010-10-22 95 views
1

嘿家伙, 所以我有这个报告,我分为不同的年龄段。如果没有与此年龄段相关联的行,我希望年龄段的计数为零。所以我在我的数据库选择中做了一个外连接,并且工作正常。但是,我需要根据数据库中的另一列添加一个组。水晶报告零值

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

任何想法?谢谢!!

+0

只包括分组方案在瑞奇集团的单行是不寻常的。我想知道为什么你需要它 - 也许会有线索。另外,看看有没有新组的Crystal生成的SQL - 查看是否有任何差异可以解释缺失的行。 – Ray 2010-10-22 21:49:53

回答

2

这是因为外部联接年龄组是不是也是一个外连接到任何你的其他 组是 - 你只保证有每个数据集各年龄组中的一个,而不是按各年龄组的一个[其他组]。

因此,例如,如果您的其他组为Region,则需要从年龄段表到地区表的笛卡尔/交叉连接(以便您可以获得年龄范围和地区的所有可能组合)到你的数据集的其余部分。

编辑 - 基于的评论,类似下面的查询应该工作:

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 

(假设它是一个需要分组到桶中的活动日期。)

+0

嗨马克, 你回答我所有的水晶问题!除了交叉连接之外还有其他解决方案吗?数据集非常大,交叉连接可能不可行。 – ntsue 2010-10-25 12:40:41

+0

@ntsue,嗨!请你可以包含更多关于[其他组]的细节,如行数,派生等?我通常希望交叉连接年龄范围 - [其他组]要比要加入的数据集小得多。进一步的细节可能会阐明替代方法(如亚当的或者使用子报告)是否更合适。 – 2010-10-25 12:56:06

+0

嗨。另一组是我的表的主键。我根据表的主键(案例编号)进行分组的原因,而不是简单地将其放在我的报告的详细信息中,因为我使用案例号来连接到另一个表(它不是主键) 。所以另一个表可能有列,“案件号码”和“事件”,其中“案件号码”不是唯一的。我基本上想要抓住与该案例号码相关的最后一个“事件”,并且我通过按案例编号进行分组并完成了此项工作,并显示了页脚中的信息而不是详细信息。 – ntsue 2010-10-25 13:59:31

1

我很难理解你的问题。

我知道水晶报表的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 

这种方式,你一定会得到你想要零点零。

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