MYSQL字符串类型的行列转换

MYSQL 的行列转换的问题

一般接触过比较大的统计数据表会有相关数据 作为支撑,而且大部分都是数据库或者在开发中遇到的问题。希望这个实验能帮助一些正在学习MYSQL 数据库的同学,顺便记录一下经验 分享下实验成果。

MySQL非数字类的聚合讲述下自己的实验过程,MSSQL和ORACLE 分别不一样 MSSQL 有关键字pivot/unpivot 进行转换 oracle case when 语句也可以接触到的同学可以去试试
下面就以MYSQL 数据库举个简单的栗子:
1、建一张原始的测试表 这个不赘诉,表都不会建的话 建议自己在自己的PC上装一个数据库 配置数据库服务,个人推荐 个人使用 MYSQL 就好了,学习初期不涉及到 分布式部署 读写分离这些很潮流的技术来对业务数据进行管理,初期学习就用MYSQL 就好啦。
言归正传
test表
数据自行填充
现在要实现行列分组转换 而显示的是名称
这个是需要的结果
学习初期阶段 学习case when 语句的时候 ,就应该知道如何将每一列数据进行分组显示了
1、
很明显 是以ID 分组 得到的结果 两列都是prodName 数据,
想到这里 ,可能有些人会分两步走
先查第一列 按照id 分开
SELECT id ,prodName FROM test WHERE prodId =1
结果
在这里插入图片描述
然后查第二列 也按照id 分开
SELECT id ,prodName FROM test WHERE prodId =2
在这里插入图片描述
两次 查询 得到了两个查询结果 到了这里 大家都会知道将这两个表 连接一下就OK 了
左右连接都行,但是具体的业务一定要自己判断左右谁为主的问题从而去合理使用左右连接
这里面直接左连接得到查询结果
SELECT
t1.id AS id ,
t1.prod1 AS prod1,
t2.prod2 AS prod2
FROM
(SELECT id AS id ,prodName AS prod1 FROM test WHERE prodId =1) t1
LEFT JOIN
(SELECT id AS id ,prodName AS prod2 FROM test WHERE prodId =2) t2
ON
t1.id = t2.id
结果为
在这里插入图片描述
的确实现了前面要求的分组,很明显这种查询很多次 join 很多次的操作 当数据列很多的时候就得去select 很多次,生产中多次查询当数据量很大必然会拖慢查询。
有时候结果一致的时候就需要大家去想想还有没有新的解决办法。此处行列转换,开始楼主想到的就是case when 语句能否实现,答案是肯定的!
但是实现起来遇到的问题需要值得去分析
1、case when 能满足 但是有用吗?,你会发现此处需要解决的不仅仅是行列转换而且还涉及记录数据分配的。
SELECT
id,
CASE WHEN prodId =1 THEN prodName END AS pro1
FROM
test
得到的结果
在这里插入图片描述
出来了 但是似乎分组就该和上述图3一致
SELECT
id,
CASE WHEN prodId =1 THEN prodName END AS pro1
FROM
test
GROUP BY id
在这里插入图片描述
为什么id 为三的 pro1的列为null
观察表中数据会发现的确是按照顺序遍历的 group by 了之后只会取顺序第一条满足distinct的值 所以 会出现id=3 的记录分组后会产生空值。
同理如果将上述
CASE WHEN prodId =1 THEN prodName END AS pro1
换成
CASE WHEN prodId =2 THEN prodName END AS pro2
得到的结果和上面分析一致
在这里插入图片描述
还是第一条空值会充当数据的 毕竟分组索引是id 空值 没有办法……
两个拼接起来一起查
SELECT
id,
CASE WHEN prodId =1 THEN prodName END AS pro1,
CASE WHEN prodId =2 THEN prodName END AS pro2
FROM
test
GROUP BY id
在这里插入图片描述
结果的确拼接了。此时我们需要考虑是不是应该怎么把这些空值给拿掉?
在搜索完社区 得到的实例全是数字类型 然后
case when 条件 then 数值 else 0 end 然后 sum(_这一段case语句) 然后可以得到准确结果
但是字符串没有SUM 怎么办?
尝试下如何?
SELECT
id,
SUM (CASE WHEN prodId =1 THEN prodName END) AS pro1,
SUM (CASE WHEN prodId =2 THEN prodName END) AS pro2
FROM
test
GROUP BY id
错误代码: 1630
具体的可以百度一下 MYSQL 错误编号 1630
简单点说就是没有SUM 函数支持这种操作
突然是不是想到了字符串连接函数 concat?
试试
SELECT
id,
CONCAT (CASE WHEN prodId =1 THEN prodName END) AS pro1,
CONCAT (CASE WHEN prodId =2 THEN prodName END) AS pro2
FROM
test
GROUP BY id
得到的结果
在这里插入图片描述
和不带CONCAT 结果是一致的。此时在想是不是因为null 无法与结果进行运算导致无法得到结果? 然后改造下case when 块
SELECT
id,
CONCAT (CASE WHEN prodId =1 THEN prodName ELSE ‘’ END) AS pro1,
CONCAT (CASE WHEN prodId =2 THEN prodName ELSE ‘’ END) AS pro2
FROM
test
GROUP BY id

结果并没有变
在这里插入图片描述
这个时候在想普通的连接不行,那就找分组连接的函数。这个时候MYSQL 字符串分组查询连接提供的函数是

GROUP_CONCAT()(划重点,要考试的…………_
然后将上述 什么SUM 、CONCAT 换掉
SELECT
id,
GROUP_CONCAT(CASE WHEN prodId =1 THEN prodName ELSE ’ ’ END) AS pro1,
GROUP_CONCAT(CASE WHEN prodId =2 THEN prodName ELSE ’ ’ END) AS pro2
FROM
test
GROUP BY id
在这里插入图片描述
尴尬了!,结果居然有”,“分割符。
所以这里善意的提醒下 典型的代码界的”画蛇添足“记得一定要拿掉 运算为null 的就别费劲了 给它在else 里面做判断,
该简洁就简洁点多好
SELECT
id,
GROUP_CONCAT(CASE WHEN prodId =1 THEN prodName END) AS pro1,
GROUP_CONCAT(CASE WHEN prodId =2 THEN prodName END) AS pro2
FROM
test
GROUP BY id
在这里插入图片描述
解决!

第一次写一个Blog ,就当小小实验分享一下。各位不喜勿喷。有改进地方请留言,让我等也学习一下,感激不尽!

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值