繁体   English   中英

考虑到将来使用 Mysql 作为 DB 会发生数据更改,mysql 查询的复杂旋转

[英]Complicated pivoting for mysql query considering the data change would occur in future using Mysql as DB

请考虑以下场景,下面是 DDL 和 DML 语句。

我想看到 output 像:

1- 对于每个新的CatName ,应该有一个新列应该存在 2- CatName应该在其中的Value列中包含数据,我不想总结它,只是简单的值是好的。

Using Mysql as database, since it doest have PIVOT function, had spent so much of time but wasted, let me know if this is achievable, the CatName is pretty dynamic in nature not a constant values, using case statements equated to the present values in如果将来此列中有更多不同的值(例如'descp4' ) ,表将仅限制并且不提供服务。

我尝试使用“into”子句生成 sql 来存储使用 GROUP_CONCAT function 生成的语句,但它没有达到目的,我感谢任何线索。

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 |  Descp3 ---: |:----- |:----- |:----- 2525 |  123 |  ABz123 |  SR 2515 |  1 |  12DL3 |  null

db<> 在这里摆弄

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM