【问题标题】:SSRS 100% Stacked Bar - Group on Field Names to show totalsSSRS 100% 堆积条 - 对字段名称进行分组以显示总数
【发布时间】:2021-02-09 02:01:03
【问题描述】:

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

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

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

--编辑 - 添加数据集样本

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',
'Success' as 'Status',
SUM(a.IsActivePolicyRequest) as 'Amount'
from(
Select 
summ.Resourceid,
summ.IsActivePolicyRequest
from v_CH_ClientSummary summ) a
UNION
select 
'Policy Request' as 'PolicyType',
'Failure' as 'Status',
(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',
'Success' as 'Status',
SUM(a.IsActiveDDR) as 'Amount'
from(
Select 
summ.Resourceid,
summ.IsActiveDDR
from v_CH_ClientSummary summ) a
UNION
select 
'Data Discovery' as 'PolicyType',
'Failure' as 'Status',
(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',
'Success' as 'Status',
SUM(a.IsActiveHW) as 'Amount'
from(
Select 
summ.Resourceid,
summ.IsActiveHW
from v_CH_ClientSummary summ) a
UNION
select 
'Hardware Inventory' as 'PolicyType',
'Failure' as 'Status',
(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',
'Success' as 'Status',
SUM(a.IsActiveSW) as 'Amount'
from(
Select 
summ.Resourceid,
summ.IsActiveSW
from v_CH_ClientSummary summ) a
UNION
select 
'Software Inventory' as 'PolicyType',
'Failure' as 'Status',
(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',
'Success' as 'Status',
SUM(a.IsActiveStatusMessages) as 'Amount'
from(
Select 
summ.Resourceid,
summ.IsActiveStatusMessages
from v_CH_ClientSummary summ) a
UNION
select 
'Status Messages' as 'PolicyType',
'Failure' as 'Status',
(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

图表:

【问题讨论】:

  • 你能分享一个你的数据集样本吗?它应该很简单,但我怀疑您的数据集可能不合适

标签: sql-server reporting-services grouping bar-chart series


【解决方案1】:

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

我创建了一些示例数据,如下所示 - 我认为这是您可能需要进行更改的地方,方法是在您的数据集查询中进行计算,但在我看到您的数据之前很难分辨。

不管怎样,这里是示例数据

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', 'Green', 12),
('Policy Request', 'Red', 3),
('Data Discovery', 'Green', 15),
('Data Discovery', 'Red', 2),
('Hardware Inventory', 'Green', 20),
('Hardware Inventory', 'Red', 2),
('Software Inventory', 'Green', 30),
('Software Inventory', 'Red', 5),
('Status Messages', 'Green', 10),
('Status Messages', 'Red', 2)

SELECT * FROM @t

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

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

它给出以下输出。


使用示例数据进行编辑


我已经把你带到了表(同样只是一个表变量,所以只需将@t 换成真实的表名。

然后我对 CTE 中的数据进行反透视,以便我可以多次引用它,然后将数据的两个副本联合起来,一个是实际值,一个是从记录数中减去的值,给你“红色”价值观。

DECLARE @t TABLE (resourceID bigint, IsActiveDDR int, IsActivePolicyRequest int,  IsActiveStatusMessages int, IsActiveHW int , IsActiveSW int,  ClientHealthEvaluation int)
INSERT INTO @t VALUES
(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);

-- 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, IsActivePolicyRequest, IsActiveStatusMessages, IsActiveHW, IsActiveSW, ClientHealthEvaluation)
        ) unpiv
    GROUP BY caption
    )

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

这给了我们以下结果

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

【讨论】:

  • 我真的不能告诉你用插入的表在做什么,所以我添加了数据集示例。当我运行您发布的内容时,我在 ssms 中收到错误,我不确定如何将我的数据添加到其中。
  • 这只是一种生成适合图表的数据集的方法。如果你运行我在 SSMS 中发布的 entore 查询,你应该得到一个结果表。稍后我会查看您的数据,看看我是否可以用它做任何事情
  • 当我运行你发布的内容时,我得到String or binary data would be truncated. The statement has been terminated.
  • 我想我知道你在做什么,我在重新格式化我的数据后再次尝试,但没有让它正确显示故障。我会把它添加到我的帖子中,以便稍后发布。
  • 我的错,我最初使用较短的名称然后忘记更改表变量。我已经更新了答案,您只需将Caption varchar(10) 部分更改为Caption varchar(30)
猜你喜欢
  • 2015-10-17
  • 2018-09-30
  • 2020-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多