需要 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
用户
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