我想找到特定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%
有帮助吗?谢谢
答案 0 :(得分:4)
您可以尝试通过汇总查询将表加入,该查询计算每个区域的总金额,例如:
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支持窗口函数(也称为OLAP函数),则这甚至更简单:
SELECT
t.*,
ROUND(100 * t.money / (SUM(t.money) OVER (PARTITION BY t.area))) area_proportion
FROM mytable t
答案 1 :(得分:1)
按照您所说的目标,您可以像这样:
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 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