mysql - 考虑到数据更改的 mysql 查询的复杂旋转将在未来使用 Mysql 作为 DB 发生
问题描述
请考虑以下场景,下面是 DDL 和 DML 语句。
我想看到这样的输出:
1-对于每个新的CatName都应该有一个应该存在的新列 2- CatName应该在其中的Value列中包含数据,我不想总结它,只是简单的值是好的。
使用 Mysql 作为数据库,因为它没有 PIVOT 功能,所以花了很多时间但浪费了,让我知道这是否可以实现,CatName在本质上是非常动态的,而不是一个常量值,使用 case 语句等于当前值如果将来此列中有更多不同的值(例如'descp4' ) ,表将仅限制并且不提供服务。
我尝试使用 'into' 子句生成 sql 来存储使用 GROUP_CONCAT 函数生成的语句,但它没有达到目的,我感谢任何线索。
CREATE TABLE `to_pivot` (
`Id` int unsigned NOT NULL AUTO_INCREMENT,
`ID2` int unsigned NOT NULL,
`CatName` varchar(255) NOT NULL,
`CatID` varchar(255) DEFAULT NULL,
`Value` varchar(255) DEFAULT NULL,
PRIMARY KEY (`Id`)
) ENGINE=MyISAM ;
INSERT INTO `to_pivot`
VALUES
(30,
2525,
'Descp1',
NULL,
123),
(29,
2525,
'Descp2',
NULL,
'ABz123'),
(27,
2525,
'Descp3',
NULL,
'SR'),(
25,
2515,
'Descp1',
NULL,
1
),
(32,
2515,
'Descp2',
NULL,
'12DL3');
解决方案
这有点棘手,您总是必须检查 @sql 才能看到,它适合您的查询。
但它是可控的
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(IF(CatName = "', CatName, '", `Value`, NULL)) AS "', CatName,'"' ) ) INTO @sql FROM (SELECT DISTINCT CatName FROM to_pivot) t1; SET @sql = CONCAT('SELECT id2,', @sql, ' FROM to_pivot GROUP BY id2'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
✓ ✓ ✓ ✓ id2 | 描述1 | 描述2 | 描述3 ---: | :----- | :----- | :----- 2525 | 123 | ABz123 | SR 2515 | 1 | 12DL3 | 无效的 ✓
db<>在这里摆弄
推荐阅读
- spring - 如何使 Spring Boot 默认为 application/json;charset=utf-8 而不是 application/json;charset=iso-8859-1
- c++ - 检查用户输入是否等于数组元素
- swift - 无法调用非函数类型“IndexPath”的值
- karate - 空手道:如何测试多部分表单数据端点?
- tensorflow - 尝试更改 keras 模型中的张量形状时出错
- python - 如果 OSError:无法打开资源,如何跳过
- cakephp - cakephp3中如何批量更新相关记录?
- android - 如何在 Android 中显示/隐藏静态片段
- c# - 如何利用 DTO、领域模型、值对象、
- javascript - 过滤应用程序脚本中存在的多个子字符串