MySQLdynamic透视

我有一个这样的产品部件表:

部分

part_id part_type product_id -------------------------------------- 1 A 1 2 B 1 3 A 2 4 B 2 5 A 3 6 B 3 

我想要一个将返回这样一个表的查询:

 product_id part_A_id part_B_id ---------------------------------------- 1 1 2 2 3 4 3 5 6 

在其实际实施中将会有数百万个产品部件

不幸的是,MySQL没有PIVOT函数,但可以使用聚合函数和CASE语句对其进行build模。 对于dynamic版本,您需要使用预准备语句:

 SET @sql = NULL; SELECT GROUP_CONCAT(DISTINCT CONCAT( 'max(case when part_type = ''', part_type, ''' then part_id end) AS part_', part_type, '_id' ) ) INTO @sql FROM parts; SET @sql = CONCAT('SELECT product_id, ', @sql, ' FROM parts GROUP BY product_id'); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt; 

请参阅SQL小提琴演示

如果你只有几列,那么你可以使用一个静态版本:

 select product_id, max(case when part_type ='A' then part_id end) as Part_A_Id, max(case when part_type ='B' then part_id end) as Part_B_Id from parts group by product_id 

SQL Server有一个PIVOT关键字,但对于MySQL,您将需要使用大量的CASE / IF语句或大量的JOIN。

这是以前的文章如何做到这一点。

只是参考两次 – (这里你没有太多的问题)

 select a.product_id, a.part_id "part_a_id", b.part_id "part_b_id" from parts a, parts b where a.product_id = b.product_id