【问题标题】:Display group with no data in Crystal Reports 12Crystal Reports 12中没有数据的显示组
【发布时间】:2011-04-20 23:29:21
【问题描述】:

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

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,并且仍然打印组。

【问题讨论】:

    标签: crystal-reports field formula suppress


    【解决方案1】:

    (+1 表示您的问题的完整性。欢迎来到 SO!)

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

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

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

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

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

    【讨论】:

    • 您好 PowerUser,感谢您的回复。有什么方法可以实现我想要的而不在服务器端进行更改?再次感谢!
    • @ntsue,如果您使用的 Crystal 版本允许您输入自己的 SQL(而不必使用 Crystal 的 Database Expert),您可以设置一个子查询作为帮助程序表 - 类似 ...` from (select 0 start, 10 end, '0-10 days' date_description union select 11, 20, '11-20 days' union select 21, 30, '21-30 days' union select 31, 99999, '31+ days') date_helper,`...
    • @Mark:好主意。你能把它变成一个完整的答案吗?我自己也在尝试这样做,但我不断收到 SQL 编译错误。
    • @ntsue,您能否将帮助表存储在 MS Access 数据库或逗号分隔的文本文件中,将其拉入 Crystal,然后在 Crystal 中进行右连接?这样,您就不必对“真实”数据源进行任何更改。如果您可以控制生成报告的机器,这应该不是问题。
    • @PowerUser,可能是因为我在评论中使用了end(SQL 中的保留字)作为列名。
    【解决方案2】:

    扩展对 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 语法。

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

    【讨论】:

    • 这行得通!,我没有意识到,因为我不得不调整我的选择语句等。非常感谢!!!
    猜你喜欢
    • 1970-01-01
    • 2010-10-25
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多