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