需要 SQL 通过组合来自不同表格的数据来帮助对用户进行排名

Need SQL help ranking users by combining data from various tables

用户

   id  | first_name
 ------+------------
    1 | Ann
    2 | Heidi
    3 | Becky
    4 | Steven
    5 | Jenny

服务 1

  id  |     user_id |       fees
------+-------------+-----------
    1 |           3 |    267732
    2 |           1 |     68647
    3 |           2 |     45954
    4 |           1 |     44655
    5 |           5 |     42957

服务 2

  id  |     user_id |       fees
------+-------------+-----------
    1 |           3 |      2632
    2 |           1 |         0
    3 |           2 |      4954
    4 |           1 |      4355
    5 |           5 |      2927

这是我的结果:

   first_name  | total_fees
 --------------+------------
    Becky      |     270364
    Ann        |     117657
    Heidi      |      50908
    Jenny      |      45884
    Steven     |          0

我对此有点陌生,但在创建查询以对总费用最高的用户进行排名时遇到了一些小问题。这是我对查询的破解。基本上我要return的名字和费用。

SELECT first_name, ((SELECT SUM(fees) FROM service1 WHERE service1.user_id = user.id) + (SELECT SUM(fees) FROM service2 WHERE service2.user_id = user.id)) AS total_fees FROM users ORDER BY total_fees DESC NULLS LAST LIMIT 10;

首先,您需要获得所有用户的总费用:

select u.*, (coalesce(s1.fee, 0) + coalesce(s2.fee, 0)) as total_fee
from users u left join
     (select user_id, sum(fees) as fee
      from service1
      group by user_id
     ) s1
     on u.id = s1.user_id left join
     (select user_id, sum(fees) as fee
      from service2
      group by user_id
     ) s2
     on u.id = s2.user_id;

在 Postgres 中,您可以使用 ANSI 标准 RANK() 函数对这些进行排名(大多数数据库支持此功能但不支持 MySQL:

select u.*, (coalesce(s1.fee, 0) + coalesce(s2.fee, 0)) as total_fee,
       rank() over (order by (coalesce(s1.fee, 0) + coalesce(s2.fee, 0))) as therank
from users u left join
     (select user_id, sum(fees) as fee
      from service1
      group by user_id
     ) s1
     on u.id = s1.user_id left join
     (select user_id, sum(fees) as fee
      from service2
      group by user_id
     ) s2
     on u.id = s2.user_id;

您可以 left join 子查询:

SELECT    first_name, COALESCE(sum1, 0) + COALESCE(sum2, 0)
FROM      users u
LEFT JOIN (SELECT   user_id, SUM(fees) AS sum1
           FROM     service1 s1
           GROUP BY user_id) ON u.id = s1.user_id
LEFT JOIN (SELECT   user_id, SUM(fees) AS sum2
           FROM     service1 s2
           GROUP BY user_id) ON u.id = s2.user_id