sql - 百分比行占总计,其中每行由 group by 子句确定

标签 sql sql-server sql-server-2005 tsql

我确定这是一个愚蠢的 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)

第一行“单件礼物”是主查询中汇总子句的结果(不确定这是否会影响计算百分比(这意味着单件礼物类别基本上是每列的总值(value)),并且每个类别选项派生自应用于查询的 group by 子句。

我想要的是能够添加两个新列,“值(value)百分比”和“count_people 百分比”,其中值(value)百分比 = 行值 05/总值 05(这是“单件礼物”的值 05 ' 类别)。 count_people 的百分比将是 count_people 的行值,再次除以总数(这是包含在“单个礼物类别行”中的内容

我使用的是 SQL Server 2005 以防有帮助。

谢谢!

最佳答案

此查询将按行为您提供百分比:

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

关于sql - 百分比行占总计,其中每行由 group by 子句确定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3718780/

相关文章:

java - 使用带有通配符的 Like 子句运行PreparedStatement

sql-server - 使用 TYPE(在 sql server 2008 中)命令将缓冲区大小限制为 255

database - 用于创建新数据库的sql脚本

sql-server - SQL 中的日期范围交集拆分

sql - MySQL 搜索查询

mysql - 基于mySql中列值的一部分分组

mysql - 如何在 MySQL 中返回数据透视表输出?

sql-server - SSIS包作业执行完成后如何查看结果?

sql - 在 SQL Server 中创建全局静态变量?

php 用户 ID 分配不起作用