MySQL数据库行转列:将多行数据合并为单行多列的查询实现
嗨,这个需求属于MySQL里常见的**行转列(Pivot)**场景,刚好你的cp值是固定的1、2、3,用条件聚合就能轻松解决。
直接上可行的查询语句,你只需要把your_table_name替换成你的实际表名就行:
SELECT id, name, MAX(CASE WHEN cp = 1 THEN time END) AS cp1, MAX(CASE WHEN cp = 2 THEN time END) AS cp2, MAX(CASE WHEN cp = 3 THEN time END) AS cp3 FROM your_table_name GROUP BY id, name;
我来拆解下这段代码的逻辑:
GROUP BY id, name是核心,它保证每个(id,name)组合最终只输出一行数据,刚好匹配你要的目标结构。CASE WHEN cp = n THEN time END会把对应cp值的time筛选出来,其他不匹配的情况会返回NULL。- 外层的
MAX()函数主要是用来排除NULL值,同时如果同一个(id,name,cp)存在多条记录(比如你数据里id=2、name=xyx的cp=2有两个time值),MAX()会取其中最大的那个。如果你想取最小的,把MAX()换成MIN()就行;要是想把所有对应值拼起来,用GROUP_CONCAT(CASE ... SEPARATOR ',')就可以实现。
如果未来你的cp值可能新增或者不固定,静态写死列名的方式就不太灵活了,这时候可以用动态SQL自动生成列,但就你当前的需求来说,上面的静态写法是最直接高效的。
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

