mysql中怎么实现列转行

我使用MySQL这么多年,对这种列到行的操作相当熟悉。
说实话,两种方法我都用过,每种方法都有各自的相关场景。

先说第一种方法,使用UNION ALL实现列切换。
第一次使用这个方法,我觉得很有趣。
就像打开礼物一样,将一列分成几列并使用 UNION ALL 将它们组合起来。
例如,假设我有一个名为 sales 的表,其中包含 Product_id、product_name、sales_amount 和 sales_date 列。
我想将它们转换为两列,一列是属性,另一列是值。

它是这样写的: sql SELECT Product_id、'product_name' AS 属性、product_name AS 值 来自销售 联合所有 SELECT Product_id, 'sales_amount' AS 属性, CAST(sales_amount AS CHAR) AS 值 来自销售 联合所有 SELECT Product_id、'sales_date' AS 属性、sales_date AS 值 来自销售 ORDER BY Product_id, attribute;
这种方法的优点是简单易懂,代码看起来还蛮顺眼的。

我们来谈谈第二种方法,使用CROSS JOIN和CASE表达式。
这种方法比较灵活,可以处理动态列名。
我记得有一次我有一个项目需要动态展开所有列,这种方法派上了用场。

它是这样写的: sql SELECT s.product_id, c.col_name AS 属性, CASE c.col_name WHEN 'product_name' THEN s.product_name 当 'sales_amount' THEN CAST(s.sales_amount AS CHAR) 当 'sales_date' 那么 s.sales_date 结束值 来自销售 CROSS JOIN (SELECT 'product_name' AS col_name UNION ALL SELECT 'sales_amount' UNION ALL SELECT 'sales_date') c ORDER BY s.product_id, c.col_name;
该方法的关键是子查询c,它会生成一个临时表,列出所有需要撤消的列名。
然后CROSS JOIN将每一行数据与列名组合起来,CASE根据列名返回对应的值。

两种方法都有各自的优点。
UNION ALL在简单场景下更加直观,CROSS JOIN和CASE在复杂场景下更加灵活。
至于MySQL 8 .0+的JSON特性,我听说过,但我自己没有运行过。
我记得数据是关于X的,但我建议你检查一下。

总之,两种方法我都用过,各有各的优点。
会根据您的需求具体情况具体分析。

定了📌【MySQL OCP】4月份考试通知✅

4 月份 MySQLOCP 考试可以随时报名。

每周一至周六考试时间不同。
提前1 天预约。

申请要求:年满1 8 岁,需要相关知识和技能。

考试形式:在线机考,1 2 0 分钟。

考试科目:管理(中文/英文)、开发(英文)。

题型分数:7 3 道单选/多选题,满分1 00分,及格分数6 2 分。

分数查询:考试后立即可查询分数。

证书颁发:通过后1 0分钟下载证书。

报名费:1 6 00元,包含报名、考试、真题。

题库:提供适量的题库供考试准备。

适合:
零经验转行:垫脚石。

数据库管理员:提高您的技能。

IT运维人员:提高运维效率。

系统集成商:掌握MySQL很重要。

报名注意事项:报名后考试有有效期。

立即行动,快速注册。