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

SQL新手求助:合并Title相同、格式不同的多行记录

解决同一Title多格式行合并为单行的SQL方案

嘿,作为SQL新手碰到这种需求太正常啦!完全可以实现把同一个Title对应的书籍、音频、视频格式合并成单行记录,我给你分享两种最常用的方法,适配不同的数据库场景:

方法一:通用条件聚合(所有SQL数据库都支持)

这是最通用的方案,不管你用MySQL、PostgreSQL、SQL Server还是Oracle都能跑通。核心思路是用GROUP BY把同一Title的行分组,再通过CASE语句把不同格式转成单独的列。

假设你的数据表叫media,包含字段Title(标题)、Format(格式),还有其他可能的属性字段(比如书籍的ISBN、音频时长等),示例SQL如下:

SELECT
  Title,
  -- 判断是否存在书籍格式,返回"有"/"无"
  MAX(CASE WHEN Format = '书籍' THEN '有' ELSE '无' END) AS 书籍格式,
  -- 判断是否存在音频格式
  MAX(CASE WHEN Format = '音频' THEN '有' ELSE '无' END) AS 音频格式,
  -- 判断是否存在视频格式
  MAX(CASE WHEN Format = '视频' THEN '有' ELSE '无' END) AS 视频格式,
  -- 如果每个格式有专属属性,也可以这样提取
  MAX(CASE WHEN Format = '书籍' THEN ISBN END) AS 书籍ISBN,
  MAX(CASE WHEN Format = '音频' THEN Duration END) AS 音频时长
FROM media
GROUP BY Title;

原理说明

  • GROUP BY Title会把所有相同标题的行归为一组;
  • CASE语句会针对每组内的不同格式行,提取对应的值或标记;
  • MAX函数用来在组内筛选出有效数据(同一组里只有一行对应某个格式,其他行的CASE结果为NULL或无,MAX会保留有效内容)。

方法二:使用PIVOT语法(部分数据库支持)

如果你的数据库支持PIVOT(比如SQL Server、Oracle、PostgreSQL 11+),可以用更简洁的透视语法来实现,适合只需要判断格式是否存在的场景:

以SQL Server为例,示例代码:

SELECT
  Title,
  CASE WHEN [书籍] = 1 THEN '有' ELSE '无' END AS 书籍格式,
  CASE WHEN [音频] = 1 THEN '有' ELSE '无' END AS 音频格式,
  CASE WHEN [视频] = 1 THEN '有' ELSE '无' END AS 视频格式
FROM (
  -- 子查询提取需要的字段
  SELECT Title, Format
  FROM media
) AS SourceData
-- 透视转换:把Format的不同值转成列
PIVOT (
  COUNT(Format) FOR Format IN ([书籍], [音频], [视频])
) AS PivotedData;

原理说明

  • 子查询先取出标题和格式字段;
  • PIVOT会自动把Format的不同取值(书籍、音频、视频)转成列,COUNT(Format)用来统计每个格式在组内的存在次数(存在则为1,不存在为0);
  • 最后用CASE把数字转成更易读的“有/无”标记。

如果你的表结构或者需求有细节调整(比如格式名称不同、需要提取更多属性),随时调整对应的字段和条件就好啦!

内容的提问来源于stack exchange,提问作者Teemoscrub

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:36:10