我正在尝试计算“qual”列中a的百分比对每个loc的总销售额。
loc | qual | sales
- - - - - - - - - - - -
us | a | 1,000
us | b | 500
gc | a | 200
gc | b | 400
所以我要找的答案是US = 66.66%(1,000 / 1,500)和gc = 33.33%(200/600)。所以返回结果将是....
loc | Pct
us | 66.66%
gc | 33.33%
谢谢!
答案 0 :(得分:1)
您需要条件聚合:
select loc,
100.00
* sum(case when qual = 'a' then sales else 0 end) -- only 'a' sales
/ sum(sales) as Pct -- all sales
from tab
group by loc
根据您的需要更改100.00 *
的精确度。
注意,除非sales
的数据类型是FLOAT或NUMBER,否则必须先将100 *
乘以然后除以。
答案 1 :(得分:0)
您可以使用聚合和窗口函数执行此操作:
select loc, count(*) as sales, sum(count(*)) over () as total_sales,
count(*) / sum(1.0*count(*)) over () as sales_proportion
from t
group by loc;
如果sales
实际上是一个整数,可能应该将其转换为浮点或十进制表示(你可以只乘以1.0)。
编辑:
糟糕,上面做了一些有用的事情,但不是OP要求的。这是最简单的方法:
select loc,
avg(case when qual = 'a' then 1.0 else 0 end) as proportion_a
from t
group by loc;
答案 2 :(得分:0)
要计算百分比,您知道需要对loc进行求和。但是你不想按loc和聚合进行分组,因为这会破坏你要保留的表的部分内容,并将结果表内部连接到你在这里的表中......好吧,那里&#39 ; s必须更简单。这就是相关子查询的来源!您可以执行子选择,该子选择计算与表中的loc相关的销售额。以下代码应该为您提供所需的内容。
select loc,
sales * 100 / (
select sum(sales)
from my_table sq
where sq.loc = t.loc
) as pct
from my_table t
where qual = 'a'
希望这有帮助!