3

我正在尝试根据年龄对数据进行分组。我使用以下数据库选择:

select * 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
left outer join table
on table.date <= date_helper.range_start*-1 + sysdate 
and table.date > date_helper.range_end*-1 + sysdate 

然后我根据 date_description 列创建一个组。我试图让它显示所有组,即使没有属于该组的记录。如果没有记录,我希望它的值为 0,并且仍然打印该组。

4

2 回答 2

2

(+1 以确保您的问题的完整性。欢迎来到 SO!)

如果一个组没有记录,那么显然Crystal是不能上报的。我建议在您的数据源中创建一个“帮助”表。这是我使用某种形式的 SQL 所做的事情:

  1. 制作一个“助手”表。它将有 1 列,并将包含您要显示的所有组。如果组的名称是动态的,您可能需要使用选择查询或生成表查询。

  2. 从您的帮助表正确连接到您的数据表。将合并的数据发送到 Crystal。

  3. 在 Crystal 中,在分组和 agebucket 计算中使用帮助表的列。

此外,在您的计算中,您应该添加一行:Else "No age";

于 2010-10-04T20:48:25.157 回答
0

扩展对 PowerUser 答案的评论,如果您使用的 Crystal 版本允许您输入自己的 SQL(而不必使用 Crystal 的数据库专家),您可以设置一个充当帮助表的子查询 - 一些喜欢:

select * 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
left outer join 
(select sysdate-5 mydate from dual union all 
 select sysdate - 25 from dual) mytable
on mytable.mydate <= date_helper.range_start*-1 + sysdate 
and mytable.mydate > date_helper.range_end*-1 + sysdate 

(Oracle 语法 - 查询的精确语法会因您使用的 SQL 方言而异。)

编辑:从 SQLServer 更改为 Oracle 语法。

进一步编辑:添加了一些简单的示例数据。

于 2010-10-05T14:01:21.517 回答