SQL根据其他值分组进行除以选择

时间:2019-02-04 11:03:38

标签: sql group-by sum grouping divide

我想找到特定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%

有帮助吗?谢谢

2 个答案:

答案 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