Как написать SQL-запрос для этого процентного запроса? - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу рассчитать процент в моей базе данных.Мой английский не очень хороший, поэтому я покажу 2 фотографии того, что я хочу сделать.

enter image description here

enter image description here

Ответы [ 3 ]

0 голосов
/ 08 апреля 2019
SELECT
    name,
    SUM(Cost) Cost,
    (SELECT sum(Cost) FROM data) TotCost,
    SUM(Cost) / (SELECT SUM(Cost) FROM data) Perc
FROM data
GROUP BY name
0 голосов
/ 08 апреля 2019

Вы можете попробовать следующее:

Ввод:

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
0 голосов
/ 08 апреля 2019

Сначала получите общую стоимость, во втором запросе мы рассчитаем стоимость и процент на основе имени.

DECLARE @tbl TABLE
(
    id int IDENTITY(1,1),
    Name varchar(100),
    Cost int
)

INSERT INTO @tbl VALUES('Kelly',100)
INSERT INTO @tbl VALUES('Tom',50)
INSERT INTO @tbl VALUES('Kelly',30)
INSERT INTO @tbl VALUES('Mike',40)
INSERT INTO @tbl VALUES('Peter',30)
INSERT INTO @tbl VALUES('Peter',10)

DECLARE @total int

SELECT @total = sum(Cost) FROM @tbl t

SELECT @total

SELECT Name, Cost = SUM(Cost), Percentage = Cast((SUM(Cost)/ (@total * 1.00)) *100.00 AS decimal(18,2)) FROM @tbl t
GROUP BY t.Name

Выход:

Name Cost Percentage Kelly 130 50.00 Mike 40 15.38 Peter 40 15.38 Tom 50 19.23

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...