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

问题描述 投票:1回答:2

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

有帮助吗?谢谢

sql database group-by sum window-functions
2个回答
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
投票

按照您所说的目标,您可以像这样去做:

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
© www.soinside.com 2019 - 2024. All rights reserved.