在SSRS 2008 R2中,我需要创建一个带有趋势线的堆积条形图。
我有一个系列组,根据需要打破堆积条形图,但它也会打破趋势线,如上图所示。我不希望它将驱动趋势线的图表系列分组,我只希望图表显示1个趋势线。这可能吗?
答案 0 :(得分:1)
在看起来像是在研究这个问题的日子之后,我终于意识到了一种可以用于我自己的数据的方法。根据数据的排列方式,可能需要SQL查询中的其他步骤。
这是我需要绘制的数据的一个小的伪样本。
select Department, SUM(Scrapped * OperationCost) As ScrapValue, TransactionDate
from MonthlyScrap
where TransactionDate between '03-01-2013' and '03-31-2013'
group by Department, TransactionDate
正如预期的那样,它给出了一个名为Department,ScrapValue和TransactionDate的三个字段的输出数据集。将其放入SSRS中的堆叠图表很简单。只需将TransactionDate拖动到Categories,Department进入Series Groups,将ScrapValue拖到Chart Data控件的Values字段中。
然而,OP也想要绘制值的TOTAL,在这种情况下,ScrapValues作为单行放到图形上。由于数据在查询和图表中的分组方式,这将不起作用。如果您再次将数据添加为值(请注意,由于堆叠图表样式,在第一次添加时已经是SUMmed),因此,由于您对系列进行分组的方式,它只是为每个单独的部门显示一条线。即使再次使用它也没有效果。因此,为了完成这项工作,您必须在SQL查询中转置(转动)您的数据(感谢Dave;)),以便正确地对其进行分组。
这是新查询。
select *
from (select Department As Dept, SUM(Scrapped * OperationCost) As ScrapValue, TransactionDate
from MonthlyScrap
where TransactionDate between '03-01-2013' and '03-31-2013'
Group by Department, TransactionDate) As Datatable
PIVOT
(
SUM(ScrapValue)
FOR Dept IN ([Molding], [Machining], [Grinding])
) AS p Order by p.TransactionDate
现在您有一个数据集,其中的字段为TransactionDate,Moulding,Machining和Grinding,按日分组(每天一行,每个部门下有值),可以轻松为总计添加最终计算字段(= Fields!Grinding.Value + Fields!Molding.Value + Fields!Machining.Value)。现在,当您创建堆积图表时,将TransactionDate拖动到Categories中,将所有其他字段拖动到Values中。您不再需要系列分组,因为查询已经处理了这个问题。最后,将计算字段的图表类型更改为折线图,现在您有一个堆积的柱形图,其中一条线代表总计!
(注意:图像显示在辅助y轴上运行总计而不仅仅是总计,但它仍然使用相同的基础方法)
这是我的最终查询,其中我添加了一些动态SQL以获取图表值并将其转换为存储过程调用以允许日期时间参数。
DECLARE @columns NVARCHAR(4000)
SELECT @columns = COALESCE(@columns + ',[' + cast( [Department] as varchar) + ']',
'[' + cast([Department] as varchar)+ ']')
FROM MonthlyScrap
GROUP BY [Department]
DECLARE @query NVARCHAR(4000)
DECLARE @startdt DATETIME
DECLARE @enddt DATETIME
SET @startdt = '20130301'
SET @enddt = '20130331'
SET @query = '
select *
from ( select [Department] As Dept, SUM(Scrapped * OperationCost) As ScrapValue, [TransactionDate]
from MonthlyScrap
where TransactionDate between @startdt and @enddt
Group by [Department], [TransactionDate]) As Datatable
PIVOT
(
SUM(ScrapValue)
FOR Dept IN (' + @columns + ')
) AS p Order by p.[TransactionDate]'
EXECUTE sp_ExecuteSQL @query,
N'@startdt datetime, @enddt Datetime',
@startdt, @enddt