【问题标题】:Summarizing by group and subgroup按组和子组汇总
【发布时间】:2011-11-04 23:43:05
【问题描述】:

我有一个水晶报表,它有一个基于两个字段的分组语句

  1. 公司名称
  2. 帐户类型

现在 Crystal 报表可以工作,它按“公司名称”分组,但不按“帐户类型”分组。我有两种类型的帐户,“普通帐户和高级帐户”。一家公司在我们这里有两种类型的账户,它是定期而不是溢价。你认为是什么问题。

我是水晶报表的新手。我虽然熟悉 SQL。我看到的区别是

  • 没有用于任何列的聚合函数 - 在 SQL 中需要聚合字段才能获得有意义的结果
  • 报告中大约有 10 个字段,但 group by 仅用于两个字段 - 在 SQL 中,如果有两个以上字段,则必须按所有字段分组
  • group by 字段位于中间和末尾 - 同样在 SQL 中 groupby 字段的顺序很重要

在这种情况下,我首先按公司名称分组,然后是帐户状态。任何见解都会有所帮助。

请注意,我从 Crystal Report 生成了等效的 SQL 语句。该查询没问题,只是没有 group by 语句。我自己添加了这些和聚合列,我得到的结果与我在 Crystal 中得到的结果相同(但 SQL 报告更准确,因为它确实按两个字段而不是一个字段分组)。

编辑:示例日期。每个公司可以有多个相同类型的帐户。我想汇总“公司名称”和“帐户类型”,以便将数据列出如下。

+----+--------------+-------------+------+
| ID | Company Name | AccountType | Sale |
+----+--------------+-------------+------+
| 1  | ABC          | I           | 500  |
| 2  | ABC          | I           | 600  |
| 3  | ABC          | O           | 1000 |
| 4  | ABC          | O           | 2000 |
| 5  | ABC          | O           | 3000 |
| 6  | XYZ          | O           | 2500 |
| 7  | LMN          | O           | 3400 |
+----+--------------+-------------+------+

我想要上表的输出是

+--------------+-------------+------+
| Company Name | AccountType | Sale |
+--------------+-------------+------+
| ABC          | I           | 1100 |
| ABC          | O           | 6000 |
| XYZ          | O           | 2500 |
| LMN          | O           | 3400 |
+--------------+-------------+------+

【问题讨论】:

    标签: crystal-reports crystal-reports-2008


    【解决方案1】:

    更新以纳入评论讨论和修改后的问题:

    解决此问题有两个基本选项:

    1) 修改 SQL 以执行所需的聚合。

    2) 在 Crystal 中,添加两组,一组用于公司,另一组用于帐户类型。

    在水晶中添加组之前,您有几个标准部分,包括报表页眉、页眉、详细信息、报表页脚和页脚。

    如果不进行分组,则在数据库中读取的每一行都会显示在详细信息部分(从技术上讲,每一行都会重复整个详细信息部分)。

    当您添加第一个组(公司)时,Crystal 在详细信息部分之前添加一个组标题#1,在详细信息部分之后添加一个组标题#1。

    如果您此时运行报表,对于每个公司,Crystal 将在与该公司关联的每组详细记录之前显示组标题,然后将显示该公司的所有详细记录,最后,将显示该公司的组页脚。

    通常,组标题用于显示不需要为每个详细记录重复的分组的公共信息。在本例中,我们可以显示公司名称和与公司相关的其他信息。

    同样,组页脚通常用于显示该组中显示的所有详细记录的摘要信息。

    在这种情况下,我们可以添加一个汇总来汇总销售金额,即该公司的总销售额,无论帐户类型如何。

    添加第二组时,会对原组进行分组。

    添加第二个组后,Crystal 会将组页眉 #2 放置在组页眉 #1 下方和详细信息上方,并将组页脚 #2 直接放置在详细信息下方和组页脚 #1 上方。

    此时,您的报告格式类似于以下内容:

    Group Header #1 (Company)
      Group Header #2 (Account Type)
        Details (the individual sale records)
      Group Footer #2
    Group Header #1
    

    在这种情况下,对于每个公司,我们希望按帐户类型对详细记录进行分组。因此,如果需要,我们可以将描述帐户类型的信息添加到 Group Header #2,我们可以将聚合添加到 Group Footer #2,以显示公司内每种帐户类型的总计。

    现在,如果只需要显示每个公司内每种帐户类型的总计,那么我们需要在报告中显示的唯一部分是 Group Footer #2。此页脚中提供了所有字段(公司、帐户类型、销售汇总),因此我们不需要任何其他区域。

    【讨论】:

    • 是的,一家公司可以同时拥有这两种类型的帐户,尽管这种情况很少见。如果我按Account Type分组,那么报告就完全不同了。
    • 抱歉,我可能对此不清楚:保留 Company 分组,但删除 AccountType 分组。如果一家公司有多种账户类型,并且您希望它们在报告中以一致的顺序显示,那么您可以在公司内按账户类型排序,但这可能不是必需的。
    • 我已经编辑了这个问题。我无法正确格式化 ASCII 表。如果单击编辑按钮,您将正确到达表格。我已经提供了原始(样机)和所需的输出。请注意,我可以在 SQL 中执行此操作,但我不熟悉 Crystla 中的工作方式。谢谢。
    • 是否有您不想在 SQL 中执行聚合的特殊原因?我个人发现让 SQL 生成我在报告中需要的输出比与 Crystal 讨价还价要容易得多。
    • 如果您确实想在 Crystal 中执行工作,那么我怀疑您可能缺少的部分是执行聚合的位置。在您的示例中,如果您首先按公司分组,然后按帐户类型分组,则您希望在报告中包含字段的唯一位置是 Group Footer #2。这是执行聚合的地方(在每个唯一的公司/集团组合结束时)。
    猜你喜欢
    • 1970-01-01
    • 2015-04-03
    • 2019-02-24
    • 2016-07-31
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多