Tsql 舍入到SSRS中的可变小数位数
我试图找到一种方法,将SSRS中的字段舍入到动态小数位数。我知道我可以动态地格式化它,最终可能会这样,但我的许多用户会直接将此报告放到Excel中,并希望有实际的数字字段 我的t-SQL代码包括以下声明的变量:Tsql 舍入到SSRS中的可变小数位数,tsql,reporting-services,sql-server-2014,reportbuilder3.0,Tsql,Reporting Services,Sql Server 2014,Reportbuilder3.0,我试图找到一种方法,将SSRS中的字段舍入到动态小数位数。我知道我可以动态地格式化它,最终可能会这样,但我的许多用户会直接将此报告放到Excel中,并希望有实际的数字字段 我的t-SQL代码包括以下声明的变量: NumLong01 DECIMAL(23,8) , NumLongDP01 INTEGER 此表中的第一组条目用于标题和舍入参数。因此,我将这两个值相加为: NULL ,4 然后我添加实际的表值,如下所
NumLong01 DECIMAL(23,8)
, NumLongDP01 INTEGER
此表中的第一组条目用于标题和舍入参数。因此,我将这两个值相加为:
NULL
,4
然后我添加实际的表值,如下所示:
543210987654321.87654321
,NULL
这样我就可以把一系列的数字放进表中,但它们的格式都必须相同
运行此查询将生成:
当我转到ReportBuilder时,我的字段有以下表达式:
=字段!NumLong01.值
如果我想格式化一定数量的小数位,我可以这样做:
=四舍五入(字段!NumLong01.Value,2)
或类似字段。不过,我想做的是让它充满活力:
=Round(Fields!NumLong01.Value,第一个(Fields!NumLongDP01.Value,“DataSet1”))
最后四舍五入到小数点后0位。随后,通过在字段中使用后半部分,我了解到这是一个空值。所以我尝试了求和而不是第一次——同样,就在我的领域——得到了我期望的4。很好,现在我有了我的数字,我把它作为四舍五入:
=Round(Fields!NumLong01.Value,Sum(Fields!NumLongDP01.Value,“DataSet1”))
唯一的问题是,这会产生一个错误。接下来,我问自己,也许出于某种原因,它没有把这看作一个数字。所以我把它添加到我的领域。没问题。所以我真的不知道它在做什么。它是否认为这个字段可能变得如此之长,以至于它将舍入非法的小数位数
现在,我可以做到:
=IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 8,Round(Fields!NumLong01.Value,8),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 7,Round(Fields!NumLong01.Value,7),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 6,Round(Fields!NumLong01.Value,6),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 5,Round(Fields!NumLong01.Value,5),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 4,Round(Fields!NumLong01.Value,4),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 3,Round(Fields!NumLong01.Value,3),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 2,Round(Fields!NumLong01.Value,2),IIf(Sum(Fields!NumLongDP01.Value, "DataSet1") = 1,Round(Fields!NumLong01.Value,1),Round(Fields!NumLong01.Value,0)))))))))
…这是有效的。但这似乎是一种荒谬的方式
我也很乐意只传递t-SQL中的四舍五入数字。但是我遇到了在报告中只显示一定数量的小数的问题,因为在数字格式中,由于某种原因,它不允许动态的小数位数
任何想法都将不胜感激 这不是一个完整的实现动态舍入或数字格式的方法列表,因为您可以使用报表中的自定义代码或调整数据集的SQL查询来实现这一点 使用舍入: 此表中的第一组条目用于标题和舍入参数。这样我就可以把一系列的数字放进表中,但它们的格式都必须相同 <>避免在报表中生成需要聚合函数的表达式,如“代码>第一个/代码>和<代码>和<代码>,然后生成一个空白行,然后必须删除,只需输入每行的小数位数,而不使用头行。成本(存储和表达式评估)很低,即使它看起来是多余的 这意味着,您可以使用
=Round(Fields!NumLong01.Value,First(Fields!NumLongDP01.Value,“DataSet1”)
而不是使用:=Round(Fields!NumLong01.Value,Fields!NumLongDP01.Value)
作为表达式或作为数据集1
中的计算字段,或调用任何数据集
使用数字格式:
但是我遇到了在报告中只显示一定数量的小数的问题,因为在数字格式中,由于某种原因,它不允许动态的小数位数
您可以为报告中的NumLong01
字段定义自定义格式,并使用表达式构建自定义格式字符串使其成为动态格式
NumLong01
textbox或tablix字段的文本框属性=“0.”+StrDup(首先(Fields!NumLongDP01.Value,“DataSet1”),“0”)
StrDup
重复指定的字符串X次
如果数字的小数部分小于所需的十进制精度,此格式化字符串将用0填充。如果不需要,请将要复制的字符串更改为“#”
如下:StrDup(首先(Fields!NumLongDP01.Value,“DataSet1”),“#”)
您也可以将此方法用作数据集中的计算字段,但前提是您已删除标题行并如前所述为每行输入小数位数。这是因为不能在计算字段表达式中使用聚合函数
为此,向数据集中添加一个计算字段,其表达式为:
=Format(Fields!NumLong01.Value,“0.”+StrDup(Fields!NumLongDP01.Value,“0”)
在这篇文章之后,我尝试使用“N4”作为格式,据我所知,它实际上在Excel中工作。在过去,当我修改其他报告时,情况并非总是如此,但我不知道为什么。所以,如果我能做到这一点,我很满意。但我仍然有兴趣知道为什么我最初的四舍五入方法没有如我所希望的那样有效。新的更新:Excel中仍然有我以前遇到的问题。只有一行,我没有什么可加的,所以我只加了一个固定的数字,比如4,这给了我一个总数。因此,它一定是Excel中的数字字段,对吗?错。当我做多行时,我会在右下角得到一个计数(不是总和),我的数字之和是0。所以我回到了我疯狂的IIf的集合。在我提出解决方案之前,我只是简单地问了几个问题。必须将小数位指定为第一位吗