2017-08-16 155 views
1

我有一张如下所示的表格。我需要根据总列值计算每行的百分比值。如何用SQL查询来实现这一点?根据SQL Server中的总列值计算每行的百分比值

enter image description here

我期待的结果是这样的:

enter image description here

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

(100/1000) * 100 = 10 

为第一个值。

(row value/grand total) * 100 

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

+0

您可以使用'CROSS JOIN'加入总成本值。然后使用此值来计算百分比,如下所示:'... CROSS JOIN(SELECT SUM(cost)FROM mytable)** t ** –

+1

**谨慎**:T-SQL中的'100/1000'是**整数**除法,并将导致** 0 **的值。您需要使用** decimal **值来获得分数结果,例如'100.0/1000.0' ..... –

回答

5

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

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

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

(SELECT SUM(Cost) FROM yourTable) 

但第一个版本我给比它需要运行单个查询可能会胜过如果没有其他原因。

输出:

enter image description here

演示在这里:

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

+0

上面的查询工作正常。如果我添加group by子句,会引发一些异常。 选择 地区, 成本, 100 *成本/(成本)总和OVER()以百分比 从yourTable组各地区,成本 如何by子句与集团实现这一目标。 –

+0

这是你想要的吗? 'SELECT Region,SUM(COST)FROM yourTable GROUP BY Region'?你总是可以提出另一个问题。 –

+0

这是你想要的吗? 'SELECT Region,SUM(COST)FROM yourTable GROUP BY Region'?你总是可以提出另一个问题。 –

0

你可以得到的结果与下面的查询。

;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