SSRS 100% Stacked Bar - 按字段名称分组以显示总计

问题描述

我正在尝试创建一个 100% 堆积条形图来显示我通过查询获得的各种计数的总数。我无法弄清楚如何使用分组允许图表的 y 轴显示我拥有的总计的不同列名。我已经在单独的图表中创建了我想要的内容,但是因为 html 格式化所有内容的方式有一堆不需要的间距,我试图在一个图表中创建它。下面的例子

enter image description here

在这里,我只是得到我所拥有的列的总和,它根据状态为每个项目返回 1 或 0。然后对于剩余的 100%,我使用一个表达式从总数中减去它们。 =Sum(Count(Fields!Computer_Name.Value)) - Sum(Fields!ClientHealthEvaluation.Value)

enter image description here

我可以修改我的查询以在结果中对所有这些进行分组,并且只查询总数,但我仍然没有找到一种方法可以在一个条形图中完成这项工作。我想知道是否有办法将所有这些都显示一个条形图中,y 轴组是单独的列,条形显示总计,因此它更清晰,或者至少知道构建所有这些单独图表的更好方法在图像中,使它们看起来更均匀。这可能吗?

--Edit - 添加数据集样本

resourceID  IsActiveDDR IsActivePolicyRequest   IsActiveStatusMessages  IsActiveHW  IsActiveSW  ClientHealthEvaluation
16784171    0   0   0   0   0   1
16784668    1   1   1   1   0   1
16784901    0   0   0   0   0   1
16785366    1   0   1   0   0   1
16786781    0   0   0   0   0   1
16786855    0   0   0   0   0   1
16787070    1   1   1   0   0   1
16787571    0   0   0   0   0   1
16787996    1   1   1   1   0   0
16788182    1   1   1   1   0   1

这是我目前拥有的数据,我在每列上使用 sum 函数获取总数。如果它更容易,我可以像下面这样分组。

Total   IsActiveDDR IsActivePolicyRequest   IsActiveStatusMessages  IsActiveHW  IsActiveSW  ClientHealthEvaluation
10  5   4   5   3   0   9

---编辑:按照建议更新数据集,现在以更适合图表的方式格式化表格。

select 
'Client Health Evaluation' as 'PolicyType','Success' as 'Status',SUM(a.ClientHealthEvaluation) as 'Amount'
from(
Select 
summ.Resourceid,case summ.LastEvaluationHealthy when 1 then 1 else 0 end as 'ClientHealthEvaluation'
from v_CH_ClientSummary summ) a
UNION
select 
'Client Health Evaluation' as 'PolicyType','Failure' as 'Status',(Count(a.resourceid) - SUM(a.ClientHealthEvaluation)) as 'Amount'
from(
Select 
summ.Resourceid,case summ.LastEvaluationHealthy when 1 then 1 else 0 end as 'ClientHealthEvaluation'
from v_CH_ClientSummary summ) a
-------------
UNION
select 
'Policy Request' as 'PolicyType',SUM(a.IsActivePolicyRequest) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActivePolicyRequest
from v_CH_ClientSummary summ) a
UNION
select 
'Policy Request' as 'PolicyType',(Count(a.resourceid) - SUM(a.IsActivePolicyRequest)) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActivePolicyRequest
from v_CH_ClientSummary summ) a
-------------
UNION
select 
'Data discovery' as 'PolicyType',SUM(a.IsActiveDDR) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveDDR
from v_CH_ClientSummary summ) a
UNION
select 
'Data discovery' as 'PolicyType',(Count(a.resourceid) - SUM(a.IsActiveDDR)) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveDDR
from v_CH_ClientSummary summ) a
-------------
UNION
select 
'Hardware Inventory' as 'PolicyType',SUM(a.IsActiveHW) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveHW
from v_CH_ClientSummary summ) a
UNION
select 
'Hardware Inventory' as 'PolicyType',(Count(a.resourceid) - SUM(a.IsActiveHW)) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveHW
from v_CH_ClientSummary summ) a
-------------
UNION
select 
'Software Inventory' as 'PolicyType',SUM(a.IsActiveSW) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveSW
from v_CH_ClientSummary summ) a
UNION
select 
'Software Inventory' as 'PolicyType',(Count(a.resourceid) - SUM(a.IsActiveSW)) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveSW
from v_CH_ClientSummary summ) a
-------------
UNION
select 
'Status Messages' as 'PolicyType',SUM(a.IsActiveStatusMessages) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveStatusMessages
from v_CH_ClientSummary summ) a
UNION
select 
'Status Messages' as 'PolicyType',(Count(a.resourceid) - SUM(a.IsActiveStatusMessages)) as 'Amount'
from(
Select 
summ.Resourceid,summ.IsActiveStatusMessages
from v_CH_ClientSummary summ) a
Order by PolicyType,Status desc

输出

PolicyType                Status    Amount
ClientHealth Evaluation   Success   13862
Client Health Evaluation  Failure   210
Data discovery            Success   13967
Data discovery            Failure   105
Hardware Inventory        Success   13854
Hardware Inventory        Failure   218
Policy Request            Success   14025
Policy Request            Failure   47
Software Inventory        Success   13713
Software Inventory        Failure   359
Status Messages           Success   14018
Status Messages           Failure   54

图表:

enter image description here

enter image description here

解决方法

如果这没有帮助,请编辑您的问题并包括您的基础数据和数据集输出的示例。

我创建了一些示例数据如下 - 我认为这是您可能需要进行更改的地方,通过在您的数据集查询中计算它,但直到我看到您的数据才难以判断。

不管怎样,这里是样本数据

DECLARE @t TABLE(Caption varchar(30),Colour varchar(10),Amount int)

INSERT INTO @t VALUES 
('Client Health Evaluation','Green',10),('Client Health Evaluation','Red',1),('Policy Request',12),3),('Data Discovery',15),2),('Hardware Inventory',20),('Software Inventory',30),5),('Status Messages',2)

SELECT * FROM @t

然后我简单地添加了一个 100% 条形图并像这样配置...

enter image description here

我所做的只是将字段拖入相应的 bin 'Values'/'Category Groups'/'Series Groups' 并添加了一些颜色格式。

给出以下输出。

enter image description here


使用示例数据进行编辑


我已经为您提供了表(再次作为表变量,因此只需将 @t 换成真实的表名。

然后我对 CTE 中的数据进行逆透视,以便我可以多次引用它,然后 UNION 数据的两个副本,一个是实际值,一个是从记录计数中减去的值,为您提供“红色”价值。

DECLARE @t TABLE (resourceID bigint,IsActiveDDR int,IsActivePolicyRequest int,IsActiveStatusMessages int,IsActiveHW int,IsActiveSW int,ClientHealthEvaluation int)
INSERT INTO @t VALUES
(16784171,(16784668,1,(16784901,(16785366,(16786781,(16786855,(16787070,(16787571,(16787996,0),(16788182,1);

-- SELECT * from @t

-- UNPIVOT THE DATA
WITH nd (caption,FlagSum,RecordCount) AS
(
    SELECT caption,SUM(flag) AS flagCount,(SELECT COUNT(*) FROM @t) AS TCount
    FROM    
        (SELECT IsActiveDDR,IsActivePolicyRequest,IsActiveStatusMessages,IsActiveHW,IsActiveSW,ClientHealthEvaluation FROM @t) p 
    UNPIVOT 
        (flag FOR caption 
            IN (IsActiveDDR,ClientHealthEvaluation)
        ) unpiv
    GROUP BY caption
    )

SELECT caption,'Green' as SeriesGroup,FlagSum FROM nd
UNION ALL
SELECT caption,RecordCount - FlagSum FROM nd

这给了我们以下结果

enter image description here

您应该可以按照上面的答案将其直接放到图表上。