SQL делится на выбор, основанный на другой группе значений - PullRequest
0 голосов
/ 04 февраля 2019

Я хотел бы найти общую денежную долю конкретного 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 голосов
/ 04 февраля 2019

Следуя тому, что вы указали в качестве своей цели, вы можете пойти так:

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
0 голосов
/ 04 февраля 2019

Вы можете попытаться объединить таблицу с помощью совокупного запроса, который вычисляет общую сумму денег в каждой области, например:

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

Если ваша СУБД поддерживает оконные функции (или функции OLAP), это еще проще:

SELECT 
    t.*, 
    ROUND(100 * t.money / (SUM(t.money) OVER (PARTITION BY t.area))) area_proportion
FROM mytable t
...