SQL: 减小结果集的大小

4
SELECT p.Distributor, SUM(r.SalesVolume) as Sales, 
((Cast(SUM(r.SalesVolume) as decimal(14, 4)) / (SELECT SUM(r.SalesVolume) FROM RawData r)) * 100) as MarketSharesVolume
FROM RawData r
INNER JOIN Product p
ON r.ProductId = p.ProductId
WHERE p.Distributor in ('TF1','WARNER')
GROUP BY p.Distributor;

以上查询的结果是:
Distributor    Sales    MarketSharesVolume
  WARNER      2836192   58.131470300744400
  TF1         268668    5.506702600797200

基本上我希望 MarketSharesVolume 有类似于 58.1 的值。我尝试过改变精度 decimal(14, 4),但每一种组合都会给我一个 算术溢出错误。是否有一种方法可以截断该列?


你可以使用一些函数来解决你的问题。只需要查看这篇文章:http://www.mssqltips.com/sqlservertip/1589/sql-server-rounding-functions--round-ceiling-and-floor/ - Tjasun
1
((Cast(SUM(r.SalesVolume) as decimal(14, 4)) / (SELECT SUM(r.SalesVolume) FROM RawData r)) * 100)ROUND 函数包装。 - ughai
@ughai 尝试过了,但是我得到的结果是 58.10000000000000 - Tauseef Hussain
你需要添加一个“convert”。 - ughai
3个回答

1

这里有一个例子。使用ROUND()函数获取正确的值,使用CONVERT()函数去除尾随零。您可以将此应用于您的查询。

DECLARE @Val DECIMAL(28, 18) = 58.131470300744400
SELECT CONVERT(decimal(28, 1), ROUND(@Val, 1))

1

您可以转换列的数据类型:

       SELECT p.Distributor, SUM(r.SalesVolume) as Sales, 
    CAST( (Cast(SUM(r.SalesVolume) as decimal(14, 4)) / (SELECT SUM(r.SalesVolume) FROM RawData r)) * 100 
   as decimal(20,1)) as MarketSharesVolume
    FROM RawData r
    INNER JOIN Product p
    ON r.ProductId = p.ProductId
    WHERE p.Distributor in ('TF1','WARNER')
    GROUP BY p.Distributor;

1
如果您使用的是 SQL Server 2012 或更高版本,您甚至可以像这样使用 FORMAT
DECLARE @v DECIMAL(18,9) = 234.234342345

SELECT @v,FORMAT(@v,'.00'),CAST(@v as DECIMAL(18,2)) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接