查询最大售票总数

问题描述 投票:0回答:1

我想找到售票总数最多的电影院:

电影院 日期 官方已售出
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
sql pieclouddb
1个回答
0
投票

您不会在结果中获得影院 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 *
删除外部查询。

© www.soinside.com 2019 - 2024. All rights reserved.