【问题标题】:Calculate percentage value for each row based on total column value in SQL Server根据 SQL Server 中的总列值计算每行的百分比值
【发布时间】:2017-08-16 15:48:24
【问题描述】:

我有一张如下表。我需要根据总列值计算每行的百分比值。如何通过 SQL 查询实现这一点?

我期待这样的结果:

请找到下面的简单计算得到结果。

(100 / 1000) * 100 = 10

第一个值。

(row value / grand total) * 100

你能帮我用 SQL 查询得到 10 作为第一行值的结果吗?提前致谢。

【问题讨论】:

  • 您可以使用CROSS JOIN 加入总成本值。然后使用这个值来计算百分比,比如:... CROSS JOIN (SELECT SUM(cost) FROM mytable) AS t
  • 小心:T-SQL中的100 / 1000是一个整数除法,结果为0。您需要使用 decimal 值来获得小数结果,例如100.0 / 1000.0 .....

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以使用SUM() 函数作为整个表的分析函数来计算总和。然后,只需将每个区域的成本除以该总和即可获得百分比。

SELECT
    Region,
    Cost,
    100 * Cost / SUM(Cost) OVER () AS Percentage
FROM yourTable

请注意,您也可以使用非相关子查询来查找总成本,例如

(SELECT SUM(Cost) FROM yourTable)

但是如果没有其他原因,我给你的第一个版本可能会优于它只需要运行一个查询。

输出:

演示在这里:

Rextester

更新:

对于您更新的查询,我可能会使用以下内容:

WITH cte AS (
    SELECT
        Region,
        SUM(Cost) AS sum_cost
    FROM yourTable
    GROUP BY Region
)

SELECT
    Region,
    sum_cost,
    100 * sum_cost / SUM(sum_cost) OVER () AS Percentage
FROM cte;

Demo

【讨论】:

  • 上述查询工作正常。如果我添加 group by 子句,它将引发一些异常。 SELECT Region, Cost, 100 * Cost / SUM(Cost) OVER () AS Percentage FROM yourTable group by Region, Cost 如何通过 group by 子句实现这一点。
  • 这是你想要的吗? SELECT Region, SUM(COST) FROM yourTable GROUP BY Region ?您可以随时提出其他问题。
  • 这是你想要的吗? SELECT Region, SUM(COST) FROM yourTable GROUP BY Region ?您可以随时提出其他问题。
  • 上述查询符合我的预期。如果我的表有冗余区域值,如何通过以下查询在不获取冗余值的情况下实现相同的值。 SELECT Region, Cost, 100 * Cost / SUM(Cost) OVER () AS Percentage FROM yourTable group by Region。
  • 用其他数据更新这个问题,或者问一个新问题。
【解决方案2】:

您可以通过以下查询获得结果。

;with Sales(region,cost,Total)
    as
    (
    select region,cost,
    (sum(cost) over()) as Total
    from YourTable
    )
    Select Region,Cost,convert(numeric(18,0),Cost/1000*100) as Per from sales

【讨论】:

    猜你喜欢
    • 2021-03-16
    • 1970-01-01
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多