1

在 SSRS 2008 R2 中,我需要创建一个带有趋势线的堆积条形图。

图表示例

我有一个系列组,可以根据需要分解堆积条形图,但它也分解出上图所示的趋势线。我不希望它对驱动趋势线的图表系列进行分组,我只希望图表显示 1 条趋势线。这可能吗?

4

1 回答 1

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 拖到类别中,将部门拖到系列组中,并将 ScrapValue 拖到图表数据控件上的值字段中。

但是,OP 还希望将值的总和绘制成图表,在这种情况下,ScrapValues 作为单线绘制到图表上。由于数据在查询和图表中的分组方式,这将不起作用。如果您再次将数据添加为值(请注意,由于堆叠图表样式,第一次添加时它已经被求和),那么由于您对系列进行分组的方式,它只会为每个单独的部门显示一条线。即使再次对它求和也没有效果。因此,为了完成这项工作,您必须在 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、Molding、Machining 和 Grinding(每天一行,每个部门下有值),这使得为 Totals 添加最终计算字段变得容易(=Fields!Grinding .Value + Fields!Molding.Value + Fields!Machining.Value)。现在,当您创建堆叠图表时,您将 TransactionDate 拖到类别中,并将所有其他字段拖到值中。您不再需要系列分组,因为查询已经解决了这个问题。最后,将计算字段的图表类型更改为折线图,您现在有一个堆积柱形图,其中一条线代表总计!

(注意:图像在辅助 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
于 2013-04-05T18:34:31.400 回答