mysql-行列转换

-------注意sum函数 是统计合-------

select   name,
sum(case when course='java' then grade end) as java,
sum(case when course='C++' then grade end) as C++,
sum(case when course='C#' then grade end) as C#
from test group by name

 

---------------------如果有字符串 就单纯的 转换用合并函数合一下  不然group by 只显示第一条------------------------------

SELECT * FROM(SELECT `name`,
GROUP_CONCAT(CASE WHEN `key`='redis.host' THEN val END SEPARATOR ',') AS `host`,
GROUP_CONCAT(CASE WHEN `key`='redis.port' THEN val END SEPARATOR ',')AS `port`,
GROUP_CONCAT(CASE WHEN `key`='redis.database' THEN val END SEPARATOR ',')AS `database`,
GROUP_CONCAT(CASE WHEN `key`='redis.pwd' THEN val END SEPARATOR ',' )AS `pwd`

FROM `sys_game_config` WHERE `name` = 'cache-1069' )a GROUP BY `name`

 

### MySQL行列转换的开发技巧 在 MySQL 数据库中,虽然不像 SQL Server 提供了内置的 `PIVOT` 和 `UNPIVOT` 关键字,但仍然可以通过一些巧妙的方式实现类似的行列转换功能。 #### 1. 使用 CASE 表达式和 GROUP BY 实现 PIVOT 效果 当需要将多行数据汇总成单行或多列时,可以利用 `CASE` 表达式配合 `GROUP BY` 来完成这一操作。这种方法适用于已知要转换的具体列名的情况[^1]。 ```sql SELECT user_name, MAX(CASE WHEN course = 'Math' THEN score END) AS Math_Score, MAX(CASE WHEN course = 'English' THEN score END) AS English_Score, MAX(CASE WHEN course = 'Science' THEN score END) AS Science_Score FROM table_grade GROUP BY user_name; ``` 此查询将用户的每门课程成绩分别显示为单独的一列。 --- #### 2. 动态生成列名以支持未知数量的列 如果目标列的数量不确定,则需借助动态 SQL 构建查询字符串并执行它。这通常涉及拼接 SQL 查询语句作为字符串来处理不同场景下的需求[^3]。 以下是构建动态 SQL 的伪代码逻辑: ```sql SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT('MAX(IF(course = ''', course, ''', score, NULL)) AS ', course)) INTO @sql FROM table_grade; SET @query = CONCAT('SELECT user_name, ', @sql, ' FROM table_grade GROUP BY user_name'); PREPARE stmt FROM @query; EXECUTE stmt; DEALLOCATE PREPARE stmt; ``` 这段脚本会自动生成适合当前数据集结构的查询命令,并返回相应的结果。 --- #### 3. UNPIVOT 模拟——通过 UNION ALL 转换多个列为行 对于反向的操作(即将多个列拆分为多行),可通过多次调用 `SELECT` 并将其联合起来形成最终的结果集合[^1]。 假设原始表格如下所示: | id | name | math_score | english_score | |----|---------|------------|---------------| | 1 | Alice | 85 | 90 | 我们希望获得这样的输出形式: | id | subject | score | |----|-------------|------------| | 1 | math | 85 | | 1 | english | 90 | 对应的 SQL 如下: ```sql SELECT id, 'math' AS subject, math_score AS score FROM table_grade UNION ALL SELECT id, 'english' AS subject, english_score AS score FROM table_grade; ``` 这种方式简单直观,尤其适用固定数目字段的情况下。 --- #### 4. 结合存储过程简化复杂变换流程 针对频繁使用的特定模式的数据重组任务,建议封装进存储过程中以便重复调用减少冗余编码工作量[^4]。 例如定义一个接受输入参数指定源表名称以及待展开的目标列列表的过程体内部按照既定算法组装相应指令再予以实施即可达成目的。 --- #### 总结 尽管 MySQL 缺少原生的支持用于直接表达这些高级概念的功能组件比如 Pivot 或者 Unpivot ,但是凭借灵活运用标准SQL特性加上一点创意完全可以克服上述局限从而满足实际项目里的各种业务诉求。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值