首页 > 解决方案 > 考虑到数据更改的 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');

标签: mysqlsqlpivot

解决方案


这有点棘手,您总是必须检查 @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<>在这里摆弄


推荐阅读