我想找到售票总数最多的电影院:
电影院 | 日期 | 官方已售出 |
---|---|---|
1 | 2024-07-28 | 10 |
2 | 2024-07-28 | 10 |
3 | 2024-07-28 | 20 |
4 | 2024-07-28 | 30 |
5 | 2024-07-28 | 20 |
电影院 | 日期 | 零售销售 |
---|---|---|
1 | 2024-07-28 | 10 |
3 | 2024-07-28 | 5 |
5 | 2024-07-28 | 10 |
6 | 2024-07-28 | 30 |
每个电影院售出的门票数量包含两部分:
official
和retail
。如果某个电影院没有售票记录,则表示0。
我想得到以下输出:
电影院 | 官方已售出 | 零售销售 | 总销量 |
---|---|---|---|
4 | 30 | 0 | 30 |
5 | 20 | 10 | 30 |
6 | 0 | 30 | 30 |
我尝试过:
WITH CombinedTickets AS (
SELECT
o.Cinema,
o.OfficialSold,
r.RetailSold,
(COALESCE(o.OfficialSold,0) + COALESCE(r.RetailSold,0)) AS TotalTickets
FROM Official o
LEFT JOIN Retail r ON o.Cinema = r.Cinema
),
MaxTickets AS (
SELECT
MAX(TotalTickets) AS MaxTotal
FROM CombinedTickets
)
SELECT
Cinema,
COALESCE(OfficialSold,0),
COALESCE(RetailSold,0),
TotalTickets
FROM CombinedTickets
CROSS JOIN MaxTickets
WHERE TotalTickets = MaxTotal
ORDER BY Cinema;
但是我得到了这个答案,我不知道为什么没有cinema 6。有人可以提供正确的方法吗?(如果你不知道我使用的数据库,你可以使用PostgreSQL代替,谢谢!)
电影院 | 官方已售出 | 零售销售 | 总销量 |
---|---|---|---|
4 | 30 | 0 | 30 |
5 | 20 | 10 | 30 |
您不会在结果中获得影院 6,因为它仅出现在两个表之一中。因此,
LEFT JOIN
查询不会获取它。
我更愿意在此处使用
UNION ALL
以确保获得所有电影院,无论它们是否出现在第一个表、第二个表或两个表中。
然后将两个查询的值相加,按 TotalSold 降序对结果进行排序,并获取具有联系的第一行:
WITH combined AS
(SELECT
cinema,
officialsold,
0 as retailsold
FROM official
UNION ALL
SELECT
cinema,
0,
retailsold
FROM retail)
SELECT c.* FROM
(SELECT
cinema,
SUM(officialsold) AS officialsold,
SUM(retailsold) AS retailsold,
SUM(officialsold + retailsold) as TotalSold
FROM combined GROUP BY cinema
ORDER BY TotalSold DESC
FETCH FIRST ROW WITH TIES) c
ORDER BY c.cinema;
这将根据请求返回示例数据的以下结果:
电影院 | 官方已售出 | 零售销售 | 总销量 |
---|---|---|---|
4 | 30 | 0 | 30 |
5 | 20 | 10 | 30 |
6 | 0 | 30 | 30 |
您可以在这里验证这一点:db<>fiddle
注意:如果不需要按影院对结果进行排序,可以使用
SELECT *
删除外部查询。