2015-07-01 2 views
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; 

Результат для приведенного выше запроса:SQL: уменьшить размер результирующего набора

Distributor Sales MarketSharesVolume 
    WARNER  2836192 58.131470300744400 
    TF1   268668 5.506702600797200 

В основном я хочу MarketSharesVolume, чтобы иметь значения, как 58.1 Я попытался изменить Прецизинность decimal(14, 4) но каждый комбинированный даритель me a Arithmetic Overflow error. Есть ли способ, которым я мог бы обрезать столбец?

+0

Вы можете использовать некоторые функции для своей проблемы. Просто взгляните на эту статью. http://www.mssqltips.com/sqlservertip/1589/sql-server-rounding-functions--round-ceiling-and-floor/ – Tjasun

+1

wrap '((Cast (SUM (r.SalesVolume) как десятичный (14, 4)))/(SELECT SUM (r.SalesVolume) FROM RawData r)) * 100) 'в [' ROUND'] (https://msdn.microsoft.com/en-us/library/ms175003.aspx) – ughai

+0

@ughai Пробовал это, но результат, который я получаю, это '58.10000000000000' –

ответ

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

Here is an example. Используя ROUND(), чтобы получить правильное значение и CONVERT(), чтобы избавиться от завершающих нулей. Вы можете применить это к вашему запросу.

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

Если вы используете SQL Server 2012 или выше вы можете даже использовать FORMAT подобное.

DECLARE @v DECIMAL(18,9) = 234.234342345 

SELECT @v,FORMAT(@v,'.00'),CAST(@v as DECIMAL(18,2)) 
Смежные вопросы