Вы можете попробовать следующее:
Ввод:
CREATE TABLE #Table (
[Name] varchar(50),
[Cost] int
)
INSERT INTO #Table
([Name], [Cost])
VALUES
('Kelly', 100),
('Tom', 50),
('Kelly', 30),
('Mike', 40),
('Peter', 30),
('Peter', 10)
Подход, используя только вычисления:
SELECT
[Name],
CONVERT(numeric(10, 2), SUM([Cost])* 100.0 / (SELECT SUM([Cost]) FROM #Table)) AS Percentage
FROM #Table
GROUP BY [Name]
ORDER BY CONVERT(numeric(10, 2), SUM([Cost])* 100.0 / (SELECT SUM([Cost]) FROM #Table))
Вывод:
Name Percentage
Kelly 50.00
Tom 19.23
Mike 15.38
Peter 15.38
При таком расчете общая сумма процентов не всегда равна 100 из-за округления и неявного преобразования типа .Следующее утверждение решает эту проблему:
;WITH CalculatedCTE AS (
SELECT
[Name],
SUM([Cost])* 100.0 / (SELECT SUM([Cost]) FROM #Table) AS Percentage,
ROW_NUMBER() OVER (ORDER BY [Name] DESC) AS Rn
FROM #Table
GROUP BY [Name]
)
SELECT
[Name],
CASE
WHEN Rn = 1 THEN CONVERT(int, [Percentage]) + (100 - SUM(CONVERT(int, [Percentage])) OVER ())
ELSE CONVERT(int, [Percentage])
END AS [Percentage]
FROM CalculatedCTE
ORDER BY [Name]
Вывод:
Name Percentage
Kelly 50
Mike 15
Peter 15
Tom 20