我有一个附件表,用于以字节为单位存储文档的大小。
我需要以KB或MB显示所有文档的结果集。如果文档小于1MB,则以KB为单位;如果文档大于1MB,则以MB为单位。
目前我在查询中已经有了这个,但是我正在努力使显示在舍入方面正确格式化。
CASE WHEN D.DocumentSize < 1000000 THEN
CONCAT(D.DocumentSize / 1024, 'KB')
ELSE
CONCAT(D.DocumentSize / 1048576, 'MB')
END AS DocumentSizeText,
以下是一些示例值:
87336
1458250
346
8434
8434
346字节也将显示0KB,因此理想情况下显示1KB将是理想的最小值。
答案 0 :(得分:1)
如果要以MB为单位指定有效的十进制值,请使用FORMAT
。 N3
这里显示3个十进制数字。
(CASE WHEN D.DocumentSize < 1000000 THEN
CONCAT(CEILING(D.DocumentSize / 1024.0), 'KB')
ELSE
CONCAT(FORMAT(D.DocumentSize / 1048576.0, 'N3'), 'MB')
END) AS DocumentSizeText
答案 1 :(得分:0)
您希望如何舍入值?如果您想要整理,请使用ceiling()
:
(CASE WHEN D.DocumentSize < 1000000 THEN
CONCAT(CEILING(D.DocumentSize / 1024.0), 'KB')
ELSE CONCAT(CEILING(D.DocumentSize / 1048576.0), 'MB')
END) AS DocumentSizeText,
答案 2 :(得分:0)
在原始问题中,它建议将值说成四舍五入
346字节也将显示0KB,因此理想情况下显示1KB 至少是理想选择
但是,对答案的澄清注释建议应显示十进制值,而不是四舍五入:
它显示2MB,但对于1458250则应为1.45MB
进一步,这个问题说
如果文档小于1MB,我需要显示一个结果集...以KB为单位;如果文档大于1MB,则需要以MB显示一个结果集
然而,问题中提出的建议答案是将数据拆分为1000000字节,这实际上仅是1兆字节的近似值,所有先前的答案都遵循这一原则。有趣的是,在格式化数据时,使用的兆字节的精确值是:1048576。
我将在下面提供三个答案-
我也将扩展答案以显示千兆字节(即使问题不是必需的-如果不需要,也可以删除该子句,但我认为读者可能会发现此扩展定义很有用)。在这两种情况下,我都将使用兆字节和千兆字节的准确定义。完全归功于实际上解决了最初问题的早期答案。
四舍五入到最接近的值
如果要处理文件大小,这是保守的做法,并且计数的字节数多于实际报告的数据。
case
when D.DocumentSize < 1048576 then concat(ceiling(D.DocumentSize / 1024.0), ' KB')
when D.DocumentSize < 1073741824 then concat(ceiling(D.DocumentSize / 1048576.0), ' MB')
else concat(ceiling(D.DocumentSize / 1073741824.0), ' GB')
end as [DocumentSizeText Rounded Up]
显示3个十进制值
也许更准确,而且可读性更差。
case
when D.DocumentSize < 1048576 then concat(format(D.DocumentSize / 1024.0, 'N3'), ' KB')
when D.DocumentSize < 1073741824 then concat(format(D.DocumentSize / 1048576.0, 'N3'), ' MB')
else concat(format(D.DocumentSize / 1073741824.0, 'N3'), ' GB')
end as [DocumentSizeText With Decimals]
正确舍入(向上或向下)
求和多个值时,比四舍五入更精确。
case
when D.DocumentSize < 1048576 then concat(format(D.DocumentSize / 1024.0, 'N0'), ' KB')
when D.DocumentSize < 1073741824 then concat(format(D.DocumentSize / 1048576.0, 'N0'), ' MB')
else concat(format(D.DocumentSize / 1073741824.0, 'N0'), ' GB')
end as [DocumentSizeText Rounded Proper]