在 MySQL 中动态地将行转换为具有多个条件的列
问题:
如何我根据两个条件动态地将 MySQL 中的行转换为列,由两个表示列?
上下文:
表包含多行,每行包含名为“数据”和“价格”的列。目标是将表格转换为新表格,其中的列代表数据和价格的唯一组合,每个单元格包含相应的行数据。
解决方案:
为了根据多个条件动态地将行转换为列,我们可以结合使用 MySQL 函数和动态SQL.
首先,我们逆透视原始表,为每个唯一的数据组合创建一个包含多行的新表和价格。
SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA;
接下来,我们使用 CASE 语句将未透视的数据聚合回列中。
SELECT id, MAX(CASE WHEN col = 'order1' THEN value END) AS order1, MAX(CASE WHEN col = 'order2' THEN value END) AS order2, MAX(CASE WHEN col = 'order3' THEN value END) AS order3, MAX(CASE WHEN col = 'item1' THEN value END) AS item1, MAX(CASE WHEN col = 'item2' THEN value END) AS item2, MAX(CASE WHEN col = 'item3' THEN value END) AS item3 FROM ( SELECT id, CONCAT('order', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT('item', item) AS col, price AS value FROM tableA ) d GROUP BY id;
为了使查询动态化,我们使用准备好的语句并动态生成基于原始表中唯一列的 CASE 语句。
SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'MAX(CASE WHEN col = ''', col, ''' THEN value END) AS `', col, '`') ) INTO @sql FROM ( SELECT CONCAT('order', `order`) AS col FROM tableA UNION ALL SELECT CONCAT('item', `item`) AS col FROM tableA ) d; SET @sql = CONCAT('SELECT id, ', @sql, ' FROM ( SELECT id, CONCAT(''order'', `order`) AS col, data AS value FROM tableA UNION ALL SELECT id, CONCAT(''item'', item) AS col, price AS value FROM tableA ) d GROUP BY id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
此动态查询处理任意数量的唯一条件并生成所需的转换表。
以上是如何根据多个条件动态地将 MySQL 中的行转换为列?的详细内容。更多信息请关注PHP中文网其他相关文章!