总体问题:
我的SQL Server中有一个表,其中包含3列(ID,值,十进制)。
因此,理论上我想做的是SELECT
列Value,并且应将其格式化为同一行中指定的小数位数。
我尝试过的事情:
SELECT CONVERT(Decimal(18,s.Decimal), s.Value ) FROM Table s
以及使用CAST
和FORMAT
的类似查询
我想要的:
表:
ID Value Decimal
1 500.754254 2
当我运行查询时,它必须返回Value为'500.75'
其他信息: 我将结果显示在WPF(C#)数据网格中,如果在那里格式化起来更容易,我不在乎。我只是不知道该怎么办。
答案 0 :(得分:1)
我们可以在此处尝试使用FORMAT
SELECT FORMAT(123.123456, '##.' + LEFT('##########', Decimal))
FROM yourTable;
上面的技巧是掩码的小数部分的宽度由Decimal
列的值确定。如果您期望需要超过10个小数位,则只需扩展###
字符串文字即可。
另一个选项可能正在使用ROUND
:
SELECT ROUND(Value, Decimal)
FROM yourTable;
但是,这种格式设置通常最好在表示层中处理。因此,我可能会寻求WPF / C#的解决方案。
答案 1 :(得分:1)
这是一个表示问题,因此,应由表示层处理。 C#有非常简单的方法来格式化输出,但是正如您在问题中所写的那样,您想知道如何在T-SQL中进行操作-因此,这里是一个使用cast
,charindex
的选项和left
。
首先,创建并填充示例表(请在您将来的问题中为我们保存此步骤):
DECLARE @T AS TABLE
(
id int identity(1,1),
[Value] decimal (18,10),
[Decimal] int
)
INSERT INTO @T ([Value], [Decimal]) VALUES
(500.754254, 2),
(50.75636, 3),
(12345.7254, 1),
(1.424, 4)
查询:
SELECT ID,
Value,
[Decimal],
LEFT(CAST([Value] As varchar(18)), CHARINDEX('.', CAST([Value] As varchar(18))) + [Decimal]) As [Left]
FROM @T
结果:
ID Value Decimal Left
1 500,7542540000 2 500.75
2 50,7563600000 3 50.756
3 12345,7254000000 1 12345.7
4 1,4240000000 4 1.4240