SSRS 2017堆叠条形图顶部显示带%的两位小数百分比问题
SSRS 2017堆叠条形图百分比显示问题排查与优化
首先,先把你的数据源和现有查询整理清楚:
数据源表结构与数据
| ID | Year | Month | Bike | Car | Bus |
|---|---|---|---|---|---|
| 1 | 2015 | Jan | 12 | 11 | 1 |
| 2 | 2015 | Feb | 11 | 3 | 5 |
| 3 | 2015 | Mar | 12 | 12 | 12 |
| 4 | 2016 | Jan | 12 | 23 | 4 |
| 5 | 2016 | Feb | 5 | 23 | 1 |
| 6 | 2016 | Mar | 4 | 34 | 7 |
当前使用的SQL查询
SELECT [Year], [Month], Bike FROM [SaleOfVeheicle] UNION SELECT 'Total' as [Year], [Month], SUM(Bike) AS Bike FROM [SaleOfVeheicle] GROUP BY [Month]
一、当前配置的核心问题
你现在的配置主要卡在百分比的格式化处理上,另外还有查询灵活性的问题:
- 百分比未格式化:你之前的表达式
(Sum(Fields!Bike.Value)/150)*100只是计算了数值,但没有做格式化,所以只会显示纯数字,不会自动加上%符号或保留两位小数。 - 查询扩展性差:现有查询只处理了
Bike,如果要扩展到Car和Bus,需要多次写UNION,效率低且维护麻烦。 - 手动加Total行不够灵活:在SQL里硬编码Total行,不如用SSRS内置的总计功能便捷,后续修改逻辑时更麻烦。
二、实现预期效果的修正步骤
1. 优化SQL查询(支持多车辆类型)
用UNPIVOT把多列(Bike/Car/Bus)转成行结构,一次性获取所有车辆类型的数据,不用多次UNION:
-- 基础数据+每月总计 SELECT [Year], [Month], VehicleType, Sales FROM [SaleOfVeheicle] UNPIVOT ( Sales FOR VehicleType IN (Bike, Car, Bus) ) AS up UNION ALL -- 新增每月各车辆类型的总计行 SELECT 'Total' AS [Year], [Month], VehicleType, SUM(Sales) AS Sales FROM ( SELECT [Year], [Month], VehicleType, Sales FROM [SaleOfVeheicle] UNPIVOT ( Sales FOR VehicleType IN (Bike, Car, Bus) ) AS up ) AS sub GROUP BY [Month], VehicleType
2. 修正百分比格式化表达式
把之前的百分比计算表达式替换为带格式化的版本,直接输出保留两位小数+%符号的结果:
- 如果是系列标签(堆叠条顶部的百分比),表达式改为:
或者用=IIF(Fields!Year.Value = "Total", FormatPercent(Sum(Fields!Sales.Value)/150, 2), "")Format函数更直观:=IIF(Fields!Year.Value = "Total", Format((Sum(Fields!Sales.Value)/150)*100, "0.00%"), "") - 系列组的标签表达式(显示年份或百分比):
=IIF(Fields!Year.Value = "Total", FormatPercent(Sum(Fields!Sales.Value)/150, 2), Fields!Year.Value)
3. 保持现有正确配置
你之前设置的填充颜色表达式是对的,继续保留:
=IIF(Fields!Year.Value="Total","Transparent","Automatic")
三、SSRS更快捷的实现方式(不用SQL写Total)
其实完全可以不用在SQL里手动加Total行,利用SSRS内置的总计功能更高效:
- 只用基础的UNPIVOT查询(不含Total部分):
SELECT [Year], [Month], VehicleType, Sales FROM [SaleOfVeheicle] UNPIVOT ( Sales FOR VehicleType IN (Bike, Car, Bus) ) AS up - 在SSRS图表中,右键点击系列组(Year),选择「添加总计」→「之后」;
- 选中新增的总计系列,设置:
- 标签表达式:
=FormatPercent(Sum(Fields!Sales.Value)/150, 2) - 填充颜色:直接在属性面板选择「透明」,或者用表达式
=IIF(Fields!Year.Value="Total","Transparent","Automatic")
- 标签表达式:
- 这样SSRS会自动计算每月各车辆类型的总计,不用在SQL里额外处理,后续修改逻辑时更灵活。
内容的提问来源于stack exchange,提问作者AskMe
相关产品推荐
相关产品推荐

