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