sql—考虑到将来使用mysql作为数据库会发生数据更改,mysql查询的数据透视非常复杂

mec1mxoz  于 2021-08-13  发布在  Java
关注(0)|答案(1)|浏览(250)

请考虑以下场景,下面是ddl和dml语句。
我想看到如下输出:
1-对于每一个新的catname应该有一个新的列,应该出现2-catname应该有在它的值列中的数据,我不想总结,只是简单的值是好的。
使用mysql作为数据库,因为它没有pivot功能,花费了很多时间,但是浪费了很多时间,让我知道这是否可以实现,catname本质上是相当动态的,不是一个常量值,如果将来此列中有更多不同的值(如“descp4”),则使用等同于表中当前值的case语句将只起限制作用。
我尝试使用'into'子句来生成sql,以存储使用group\u 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');
gg58donl

gg58donl1#

这有点棘手,您必须始终选中kc@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 | Descp1 | Descp2 | Descp3
---: | :----- | :----- | :-----
2525 | 123    | ABz123 | SR    
2515 | 1      | 12DL3  | null  

✓

db<>在这里摆弄

相关问题