SQL 根据其他值分组除以 select
SQL divide by select based on other value grouping
我想找出特定 profile_id 的总金额与相同区域的其他 profile_id 的总金额相比的比例。 db_A
Profile_id | money | area
----------------------------
A1 | 100 | b1
A2 | 200 | b2
A3 | 400 | b1
A4 | 600 | b2
所以我有一个 SQL 查询,例如
select profile_id, area, money,
sum(total_money)/
select (
sum(total_money)-- here I dont know how to grouping by area
) as area_proportion
from db_A
group by 1
并希望获得如下结果:
profile_id. | area | money. | area_proportion
----------------------------------------------
A1 | b1 | 100 | 20%
A2 | b2 | 200 | 25%
A3 | b1 | 400 | 80%
A4 | b2 | 600 | 75%
有什么帮助吗?谢谢
您可以尝试使用聚合查询加入 table,计算每个区域的总金额,例如:
SELECT t.*, ROUND(100 * t.money / g.money) area_proportion
FROM
mytable t
INNER JOIN (SELECT area, SUM(money) money from mytable GROUP BY area) g
ON g.area = t.area
如果您的 RDBMS 支持 window 函数(又名 OLAP 函数),这就更简单了:
SELECT
t.*,
ROUND(100 * t.money / (SUM(t.money) OVER (PARTITION BY t.area))) area_proportion
FROM mytable t
按照你说的目标,你可以这样走:
select profile_id, area, money,
sum(total_money)/
(select sum(total_money) from db_A as dba2 where dba2.area = dba1.area and dba2.profile_id != dba1.profile_id) as area_proportion
from db_A as dba1
group by profile_id
尽管如此,我假设您想删除 and dba2.profile_id != dba1.profile_id
部分,因为您可能想要一个用户拥有该地区所有金钱的部分。
一种更有效的方法是使用单个子select创建一个视图并像这样加入它:
select profile_id, area, money,
sum(total_money) / area_total_money as area_proportion
from db_A as dba1 join (select area, sum(total_money) as area_total_money from db_A as dba2 group by area ) as area_money on dba1.area = area_money.area
group by profile_id
我想找出特定 profile_id 的总金额与相同区域的其他 profile_id 的总金额相比的比例。 db_A
Profile_id | money | area
----------------------------
A1 | 100 | b1
A2 | 200 | b2
A3 | 400 | b1
A4 | 600 | b2
所以我有一个 SQL 查询,例如
select profile_id, area, money,
sum(total_money)/
select (
sum(total_money)-- here I dont know how to grouping by area
) as area_proportion
from db_A
group by 1
并希望获得如下结果:
profile_id. | area | money. | area_proportion
----------------------------------------------
A1 | b1 | 100 | 20%
A2 | b2 | 200 | 25%
A3 | b1 | 400 | 80%
A4 | b2 | 600 | 75%
有什么帮助吗?谢谢
您可以尝试使用聚合查询加入 table,计算每个区域的总金额,例如:
SELECT t.*, ROUND(100 * t.money / g.money) area_proportion
FROM
mytable t
INNER JOIN (SELECT area, SUM(money) money from mytable GROUP BY area) g
ON g.area = t.area
如果您的 RDBMS 支持 window 函数(又名 OLAP 函数),这就更简单了:
SELECT
t.*,
ROUND(100 * t.money / (SUM(t.money) OVER (PARTITION BY t.area))) area_proportion
FROM mytable t
按照你说的目标,你可以这样走:
select profile_id, area, money,
sum(total_money)/
(select sum(total_money) from db_A as dba2 where dba2.area = dba1.area and dba2.profile_id != dba1.profile_id) as area_proportion
from db_A as dba1
group by profile_id
尽管如此,我假设您想删除 and dba2.profile_id != dba1.profile_id
部分,因为您可能想要一个用户拥有该地区所有金钱的部分。
一种更有效的方法是使用单个子select创建一个视图并像这样加入它:
select profile_id, area, money,
sum(total_money) / area_total_money as area_proportion
from db_A as dba1 join (select area, sum(total_money) as area_total_money from db_A as dba2 group by area ) as area_money on dba1.area = area_money.area
group by profile_id