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
相关产品推荐
相关产品推荐

