65.9K
CodeProject 正在变化。 阅读更多。
Home

SSRS – 钻取报表

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.80/5 (3投票s)

2015年5月5日

CPOL

11分钟阅读

viewsIcon

49860

了解 SSRS 报表“操作”功能以及报表中的钻取概念。

我们将学习什么?

  1. 如何创建简单的饼图
  2. 如何创建简单的数据表
  3. 如何使用报表参数(简短演示)
  4. 报表中的钻取是什么意思
  5. 如何实现钻取功能。
  6. 完成一个示例。

本文部分内容基于我之前的文章 SSRS – 使用柱形图。我建议在继续之前先阅读这篇文章,以免感到茫然!

  1. 我们将继续使用我们在上一篇文章 SSRS – 使用柱形图 中创建的报表,并扩展它来演示钻取功能。
  2. 我们现在将在报表的左下角添加一个图表。
  3. 如前所述,插入图表控件后,会出现一个选择图表类型的对话框。在该窗口中选择饼图。
  4. 在此示例中,我们将选择以下饼图


     
  5. 通过单击并拖动所选图表左上角的十字准星图标,将饼图放置在适当的位置。
  6. 请注意,图表控件实际上由许多小型控件组成(例如轴的文本框、图表主体、主刻度和次刻度等),请确保您选择要操作的正确元素。我个人曾经在处理一些复杂结构中的控件时弄混过几次。
  7. 您的报表现在应该看起来像这样

  8. 就像我在上面提到的上一篇文章中看到的条形图报表一样。单击饼图主体也会弹出一个新的上下文菜单,允许您快速配置图表需要表示的字段。
  9. 但在配置图表之前,我们必须配置图表报表的数据集。为此,右键单击“数据集”文件夹,然后单击“添加数据集...”,将出现以下窗口

  10. 按照上面的方式配置您的数据集,并在查询框中使用以下查询
    SELECT EPO.SalesPersonId as EmployeeID, OrderPrice TotalRevenue,
    p.ProductId, p.ProductName, p.ProductPrice, EPO.Location, CONVERT(int,(OrderPrice/ProductPrice)) as Quantity
    FROM EmployeeProductOrder EPO
    INNER JOIN Product P on EPO.ProductId = P.ProductId
    WHERE (@EmpId is null and 1=1) or (SalesPersonId = @EmpId)
  11. 在上面的查询中,`@EmpId` 变量为 null 时,`WHERE` 条件被特别编写为返回所有员工的数据。
  12. 以下是我们构建上述查询所基于的数据库图

  13. 因此,我们在这里尝试查找员工及其总收入,以及销售产品详情以及产品在总收入中所占的比例。为简单起见,我保持 SQL 查询非常简单,并且不想深入研究准确的业务逻辑,在实际应用中,我们更倾向于使用复杂的 SQL 查询,然后将其形成存储过程并在报表中使用,而不是简单的查询。
  14. 然后,我们将检查数据集弹出窗口中的“字段”部分,在“参数”部分,我们将在左侧看到查询需要一个参数,即`@EmpId`

  15. 但它的“参数值”列中没有任何内容。此时,BI 工具的强大之处就在于,如果您简单地单击“确定”,该工具将在“报表数据”窗口的“参数”文件夹中创建一个新参数,如下所示

  16. 暂时不要担心其他数据集,我们将在本文中逐渐学习它们。
  17. 现在我们的数据集已准备就绪,我们可以配置我们的图表以饼图格式从该数据集渲染数据了
  18. 回到之前在报表主体上创建的图表,右键单击图表并选择“图表属性...”,将打开以下弹出窗口,我们需要在此处将图表介绍给已创建的数据集

  19. 如上所示选择数据集,在此示例中我没有讨论数据源,因为我已在之前的文章中涵盖了。如果您对数据源创建有任何疑问,请参考该文章。
  20. 单击上面窗口中的“确定”按钮后,就可以实际设置饼图并告诉它需要使用哪个字段来显示数据了
  21. 只需单击 BI 工具已显示的示例虚拟图表区域,就会打开一个名为“图表数据”的智能标记窗口,您可以在其中设置图表需要查找数据的字段。

  22. 如上所示,通过单击“类别组”下的“+”(加号)符号选择“ProductName”,然后在“值”部分选择“Quantity”。BI 工具会自动将 `Sum(Quantity)` 作为您的值,这是默认行为,可以通过单击 `Sum(Quantity)` 下拉选项选择“聚合”,然后选择相应的选项来更改。否则,使用“TotalRevenue”列的下拉菜单选择“系列属性...”,这将打开以下窗口

  23. 在此窗口中,单击“值”字段文本框旁边的“函数”按钮将允许您为报表中显示的值提供自定义表达式。
  24. 此窗口还提供各种其他选项,例如
    1. 是否在特定条件下显示/隐藏图表
    2. 切换显示图例或为此系列自定义图例
    3. 当用户单击此系列时要执行的任何操作 - 这将在稍后解释报表钻取功能时进行说明。
    4. 用特定颜色填充系列或使用系统定义的颜色
    5. 边框和阴影是不言自明的
  25. 提供适当的设置后,关闭此窗口并运行报表,您的报表应如下所示

  26. 由于我们未向 `@EmpId` 报表参数传递任何值,因此上面的图表显示所有员工的数据。在图表配置中将“ProductName”作为类别也创建了其下的图例。
  27. 要显示图表上的百分比标记,请使用图表主体的“标记”设置,右键单击图表主体并选择“显示数据标签”,这将显示您的数据。要进一步更改设置,例如添加百分比符号,请再次右键单击图表上的任何一个数据标签,然后单击“系列标签属性...”

  28. 在“标签数据”部分,单击“函数”按钮并提供以下表达式
    =CDec(Sum(Fields!Quantity.Value,  
    Chart3_CategoryGroup")/Sum(Fields!Quantity.Value, "dsPieChart"))

    上述表达式计算每个产品在总收入中所占的百分比。

  29. "Chart3_CategoryGroup" 实际上是操作的范围。在 SSRS 中,您实际上可以在运行时对某些数据组执行操作。在此示例中,"Chart3_CategoryGroup" 是在图表设置中提供的类别组的名称。而 "dsPieChart" 是数据集的名称,因此在此范围内计算的求和将计算数据集中所有 Quantity 值的总和。
  30. 下图显示了图表类别组项的范围。单击“类别组”部分下“ProductName”旁边的下拉列表,然后选择“类别组属性...”

  31. 我们将在接下来的文章中详细讨论范围。此功能将减轻您查询/存储过程的许多负担,并将其转移到报表呈现操作。简而言之,范围允许您对数据库的某个子集执行操作,该子集相对于您在报表中定义的组。要了解有关范围的更多信息,请阅读 MSDN 的这篇文章
  32. 因此,一旦我们定义了系列标签,我们就可以单击预览按钮,看看我们的图表报表是什么样的。在进行一些背景颜色更改后,它看起来会像这样。

  33. 接下来,我们将尝试创建一个 Tablix 结构,根据作为参数传递的员工 ID 显示员工详细信息。
  34. Tablix 是一个容器控件,包含行和列,可以对行和列进行分组并相应地表示数据。Tablix 本身是 SSRS 中一个复杂的控件,具有许多功能,我们将在下一篇文章中讨论。
  35. 继续我们的示例,让我们先在报表的右下角绘制一个 Rectangle 控件,然后在其中放置一个 Matrix 控件(一种 Tablix)。您的报表现在应该看起来像下面这样

  36. 在继续进行报表设计之前,让我们为这个报表设计数据集。为此,转到“数据集”文件夹,右键单击并选择“添加数据集...”。在窗口中,选择您之前创建的数据源,然后在查询框中放入以下 SQL 查询
    SELECT        EmployeeId, EmployeeName, EmployeeDeptId, Region, Salary, Photo
    FROM            Employee
    Where EmployeeId = @EmpId
  37. 您会注意到,我还有一个包含员工照片的“photo”列。此外,此查询还将使用之前为饼图创建的相同报表参数 `EmpId`。
  38. 您会注意到,当您将表控件插入 Rectangle 后,BI 工具会自动为您创建一个行分组。目前我们不需要这个行分组,所以我们将右键单击下面的组定义并单击“删除组”,如下所示。单击“删除组”后,将弹出一个窗口,询问您是只删除组还是同时删除行,目前我们只删除组,因此将选择选项 2。

  39. 现在我们将为表添加两列和几行,这将创建我们需要显示数据的单元格。右键单击第一列以合并您的 4 行单元格。您的网格现在应该看起来像下面这样

  40. 我还添加了一个 Image 控件到合并的列中,我将在其中显示员工的照片。
  41. 现在,正如您在上面的图片中看到的,我已经将数据集字段绑定到了最右侧列的单元格中
  42. 现在出现的问题是,`@EmpId` 的值从哪里来?这里就出现了我们 SSRS 的第一个钻取功能
  43. 要实现这一点,请回到我们的条形图部分,右键单击系列定义并单击“系列属性”

  44. 在弹出的窗口中,转到“操作”选项卡,并填写详细信息,如下所示

  45. 如您所见,“操作”部分定义了单击数据系列时要执行的操作,在这里我们要求图表重新渲染自身,但这次使用参数 `EmpId`(这是我们的报表参数)和值来自 `EmployeeId` 字段进行渲染。这将把此操作绑定到每个系列条形图,因为我们的每个条形图都代表一个员工,因此单击任何条形图都会重新渲染我们的图表,但这次 `EmpId` 参数会用员工 ID 填充。
  46. 现在,请继续运行此应用程序,它最初会像这样渲染

  47. 这里的条形图正如预期的那样,显示所有员工到目前为止的总销售额。另一方面,我们的饼图也显示了所有产品的总销售额(按产品详情),这是因为我们为报表数据集编写的查询类型,如第 11 点之前提到的。
  48. 现在,当您单击条形图中的任何一个条形图时,整个报表会像下面这样重新渲染

  49. 因此,您可以在饼图和员工详细信息部分看到单个员工的详细信息。这样,我们就从一个汇总报表钻取到了更精简的信息,这是报告钻取的一种方式。
  50. 继续进行另一种钻取方式,我们通常在许多 Excel 工作簿中看到。让我先向您展示最终结果,以便您对我说的话有个大致了解

  51. 所以您可以看到,所有主要行前面都有一个小的“+”标记,单击该标记会展开下面的子行。最初,所有行都折叠起来,显示我们的汇总数据(在我同意的这个示例中数据不多,但在实际应用中情况不同),然后可以进一步钻取到详细报表
  52. 让我们看看如何开始这个报表。首先,我们将在项目中添加一个新报表,并将其命名为 EmployeeOrder.rdl

  53. 然后我们将配置我们的数据源,并为我们的数据集使用以下查询
    SELECT OrderId, SalesPersonId, OrderPrice, Location, ProductId
    FROM EmployeeProductOrder
  54. 之后,我们将 Table 控件拖到报表主体上,并为该 Table 控件添加父分组,如下所示

  55. 将组设置为 SalesPersonId,然后在其他列中选择剩余字段,这些将是详细报表的一部分。您的分组窗口将如下所示

  56. 现在要创建那些“+”标记,转到设计器窗口底部的分组的“详细信息”部分,然后选择“组属性”,这将打开一个弹出窗口,在“可见性”选项卡中设置以下配置

  57. 保存此配置并预览报表后,它将显示我们预期的报表行为

通过一些着色和装饰,它将看起来和我之前演示的一模一样。

我希望这些文章能够进一步阐明您对 SSRS 工具的知识,并突出 SSRS 在数据分析和报表方面的强大功能。下次见,学习愉快!!!

© . All rights reserved.