You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在给定SQL代码的rcount列上添加SUM聚合函数

你现有的SQL语句,是统计指定分类下每部电影的出租次数,输出字段为电影名称、分类名称、对应出租次数rcount。你要对rcount做SUM聚合,根据不同的使用场景,有以下两种常见修改方案:

方案1:在现有结果基础上新增汇总行,得到所有rcount的总和

可以用MySQL支持的WITH ROLLUP语法,直接在GROUP BY语句后追加即可,修改后的代码如下:

SELECT 
  IFNULL(`a.film_title`, '总计') AS `film_title`, 
  IFNULL(`a.category_name`, '') AS `category_name`, 
  COUNT(`a.film_title`) AS `rcount`
FROM 
  (
    SELECT 
      `f.title` AS `film_title`, 
      c.name AS `category_name` 
    FROM 
      film f 
      JOIN `film_category` b ON `b.film_id` = `f.film_id` 
      JOIN category c ON `c.category_id` = `b.category_id` 
      JOIN inventory i ON `i.film_id` = `f.film_id` 
      JOIN rental r ON `r.inventory_id` = `i.inventory_id` 
      AND c.name in (
        'Animation', 'Children', 'Classics', 
        'Comedy', 'Family', 'Music'
      )
  ) a 
GROUP BY 
  1, 2 WITH ROLLUP
ORDER BY 
  2, 1;

该方案的查询结果最后会多一行汇总,film_title显示为「总计」,rcount就是所有电影出租次数的总和。

方案2:给每一行都追加聚合统计值

如果你需要每一行都带上全局总和、或者对应分类的总和,可以用窗口函数实现,修改后的代码如下:

SELECT 
  `a.film_title`, 
  `a.category_name`, 
  COUNT(`a.film_title`) AS `rcount`,
  -- 全局所有rcount的总和
  SUM(COUNT(`a.film_title`)) OVER() AS global_total,
  -- 同分类下所有电影的rcount总和
  SUM(COUNT(`a.film_title`)) OVER(PARTITION BY `a.category_name`) AS category_total
FROM 
  (
    SELECT 
      `f.title` AS `film_title`, 
      c.name AS `category_name` 
    FROM 
      film f 
      JOIN `film_category` b ON `b.film_id` = `f.film_id` 
      JOIN category c ON `c.category_id` = `b.category_id` 
      JOIN inventory i ON `i.film_id` = `f.film_id` 
      JOIN rental r ON `r.inventory_id` = `i.inventory_id` 
      AND c.name in (
        'Animation', 'Children', 'Classics', 
        'Comedy', 'Family', 'Music'
      )
  ) a 
GROUP BY 
  1, 2 
ORDER BY 
  2, 1;

你可以根据实际需要保留对应聚合字段即可。

内容的提问来源于stack exchange,提问作者Israel Owusu Ansah

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:48:03