【问题标题】:SQL divide by select based on other value groupingSQL 根据其他值分组除以选择
【发布时间】:2019-06-28 02:41:44
【问题描述】:

我想找出特定 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 join group-by sum window-functions


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      您可以尝试使用聚合查询连接该表,该查询计算每个区域的总金额,例如:

      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
      

      【讨论】:

        猜你喜欢
        • 2021-11-12
        • 2021-07-15
        • 2022-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-24
        • 2012-12-24
        相关资源
        最近更新 更多