Процентная строка составляет общее количество, где каждая строка определяется по группам по предложению - PullRequest
3 голосов
/ 15 сентября 2010

Я уверен, что это глупый вопрос n00b, но у меня есть следующая таблица результатов (которая создается с помощью длинного запроса, который я понимаю только наполовину), и я хотел бы иметь возможность добавить в два столбцы, которые обрабатывают процент строки по отношению к итогу:

Пример таблицы результатов:

CREATE TABLE #temp
(category varchar(30)
,count_people INT
,numpayments05 INT
,avegifts05 DECIMAL(4,2)
,value05 DECIMAL(18,2)
,donorvalue05 DECIMAL(18,2)
,giftvalue05 DECIMAL(18,2)
)
INSERT INTO #temp VALUES ('Single Gifts',124945,182458.00,1.46,28787034.10,230.40,157.77)
INSERT INTO #temp VALUES ('New Donor',67598,78799.00,1.17,5915450.93,87.51,75.07)
INSERT INTO #temp VALUES ('Reactivated',19853,27394.00,1.38,4348419.38,219.03,158.74)
INSERT INTO #temp VALUES ('2yrs consecutive',20604,31633.00,1.54,3556766.75,172.63,112.44)
INSERT INTO #temp VALUES ('3/4yrs consecutive',7536,13251.00,1.76,1827917.34,242.56,137.95)
INSERT INTO #temp VALUES ('5+yrs consecutive',9354,31381.00,3.35,13138479.70,1404.58,418.68)

Верхняя строка, «одиночные подарки», является результатом предложения свертки основного запроса (не уверен, влияет ли это на вычисление процента (что означает, что категория одиночных подарков, по сути, представляет собой общее значение для столбца), и каждый Параметр category происходит от предложения group by, примененного к запросу.

То, что я хочу, это иметь возможность добавлять в два новых столбца, «процент от стоимости» и «процент от count_people», где процент значения = значение строки 05 / общее значение 05 (что является значением 05 для «одного подарка» категория). Процент count_people будет значением строки для count_people, опять же деленным на общее количество (что содержится в «строке категории одиночных подарков»

Я нахожусь на SQL Server 2005 на случай, если это поможет.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010

Этот запрос даст вам ваши проценты по строкам:

SELECT category, count_people, numpayments05, avegifts05, value05, donorvalue05, giftvalue05,
    value05 / SUM(CASE category WHEN 'Single Gifts' THEN value05 ELSE 0.0 END)
        OVER (PARTITION BY 1) AS [percentage of value],
    count_people / SUM(CASE category WHEN 'Single Gifts' THEN count_people ELSE 0.0 END)
        OVER (PARTITION BY 1) AS [percentage of count_people]
FROM #temp ;


Предполагается, что вы создадите два новых столбца в #temp со следующим:

CREATE TABLE #temp
(category varchar(30)
,count_people INT
,numpayments05 INT
,avegifts05 DECIMAL(4,2)
,value05 DECIMAL(18,2)
,donorvalue05 DECIMAL(18,2)
,giftvalue05 DECIMAL(18,2)
,[percentage of value] decimal(5,2)
,[percentage of count_people] decimal(5,2)
)
INSERT INTO #temp VALUES ('Single Gifts',124945,182458.00,1.46,28787034.10,230.40,157.77, null, null)
INSERT INTO #temp VALUES ('New Donor',67598,78799.00,1.17,5915450.93,87.51,75.07, null, null)
INSERT INTO #temp VALUES ('Reactivated',19853,27394.00,1.38,4348419.38,219.03,158.74, null, null)
INSERT INTO #temp VALUES ('2yrs consecutive',20604,31633.00,1.54,3556766.75,172.63,112.44, null, null)
INSERT INTO #temp VALUES ('3/4yrs consecutive',7536,13251.00,1.76,1827917.34,242.56,137.95, null, null)
INSERT INTO #temp VALUES ('5+yrs consecutive',9354,31381.00,3.35,13138479.70,1404.58,418.68, null, null)


Вы можете запустить следующее обновление, чтобы сохранить проценты на строку:

WITH cte AS
    ( SELECT category,
    value05 / SUM(CASE category WHEN 'Single Gifts' THEN value05 ELSE 0.0 END)
        OVER (PARTITION BY 1) AS [percentage of value],
    count_people / SUM(CASE category WHEN 'Single Gifts' THEN count_people ELSE 0.0 END)
        OVER (PARTITION BY 1) AS [percentage of count_people]
    FROM #temp
    )

UPDATE #temp
SET [percentage of value] = cte.[percentage of value],
    [percentage of count_people] = cte.[percentage of count_people]
FROM #temp
JOIN cte ON #temp.category = cte.category
1 голос
/ 15 сентября 2010

Сделайте это во втором запросе, используя первый в качестве ввода.Не пытайтесь изменить первый запрос, чтобы добавить эти вычисления, он достаточно сложный, как есть.

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