前言:
工具是为实现需求服务的。不同的工具提供了不同的方式,在选择过程中,选择最优最快的实现方式,这是一个成熟的码农必备的技能。本篇参考了CodeProject上的这篇文章:Using SSRS - Matrix Control to Generate Columns Dynamically
场景:SQL Server 2012 AdventureWorks2012 数据库。
目的:实现按照用户选择的时间区间按月显示每个产品销售数量和销售业绩。
数据准备:销售数据是按行按日期纵向排列在销售表Sales.SalesOrderHeader和Sales.SalesOrderDetail表中。
实现方式:1.可以使用PIVOT或者CASE WHEN动态SQL实现按月分类
2.使用SSRS的Matrix实现动态列的显示。
本篇主要介绍第二种实现方式。
数据准备:
USE AdventureWorks2012;
GO
/×
DECLARE @StartDate DATETIME ='01/01/2008'
DECLARE @EndDate DATETIME ='12/31/2008'
×/
SELECT
P.ProductNumber
, P.Name
, CONVERT(CHAR(6),SOH.OrderDate,112) AS 'SaleMonth'
, SUM(SOD.OrderQty) AS 'OrderQty'
, SUM(SOD.LineTotal) AS 'SubTotal'
FROM [Sales].[SalesOrderHeader] SOH
INNER JOIN [Sales].[SalesOrderDetail] SOD
ON SOD.SalesOrderID = SOH.SalesOrderID
INNER JOIN [Production].[Product] P
ON SOD.ProductID = P.ProductID
WHERE SOH.[Status] =5 -- Shipped
AND SOH.OrderDate BETWEEN @StartDate AND @EndDate
GROUP BY
P.ProductNumber
, P.Name
, CONVERT(CHAR(6),SOH.OrderDate,112)
ORDER BY
P.ProductNumber
, P.Name
, CONVERT(CHAR(6),SOH.OrderDate,112)
;12345678910111213141516171819202122232425262728
实现步骤:
1.建立新的项目工程DynamicalColumnSample。
2.建立共享数据源(Shared Data Source),AdventureWorks2012.rds。
3.建立共享数据集(Shared Data Set),dsProduct.rsd。
4.建立一张空报表DynamicalColumnSample.rdl。
5.拖动工具箱中的Textbox控件,建立表头信息和执行时间信息。
6.拖动工具箱中的Matrix控件,建立报表数据部分.如图所示。
7.在报表数据页中选择对应的dsProduct数据集,拖动数据集中的Name和ProductNumber,显示到行组合(Row Group)信息中,如图所示。
8.拖动dsProduct数据集中的SaleMonth列,显示到列组合(Column Group)中显示,同时添加一个新的标题行,将OrderQty和MonthlyTotal到列组合(Column Group),如图所示。
9.最后添加Subtotal到最后一列,整张报表设计如下:
报表实现的效果:
1.当开始时间为01/01/2008到02/01/2008时,显示为:
2.当开始时间为01/01/2008到03/01/2008时,显示为:
3.当开始时间为01/01/2008到04/01/2008时,显示为:
实现了动态表头的功能。
文中涉及到的源代码:源代码
参考文章:
1.Using SSRS - Matrix Control to Generate Columns Dynamically
---------------------
作者:hery2002
来源:CSDN
原文:https://blog.csdn.net/hery2002/article/details/45743057
版权声明:本文为博主原创文章,转载请附上博文链接!