MySQL动态枢轴

我有一张这样的产品零件表:


部分


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

在其实际实施中,将有数百万个产品零件


呼唤远方
浏览 564回答 3
3回答

桃花长相依

不幸的是,MySQL没有PIVOT函数,但是您可以使用聚合函数和CASE语句对其进行建模。对于动态版本,您将需要使用准备好的语句: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 @sqlFROM  parts;SET @sql = CONCAT('SELECT product_id, ', @sql, '                   FROM parts                    GROUP BY product_id');PREPARE stmt FROM @sql;EXECUTE stmt;DEALLOCATE PREPARE stmt;请参见带有演示的SQL Fiddle如果只有几列,则可以使用静态版本: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_Idfrom partsgroup by product_id

摇曳的蔷薇

SQL Server有一个PIVOT关键字,但是对于MySQL,您将需要使用很多CASE / IF语句或很多JOIN。这是有关如何执行此操作的先前文章。

慕尼黑8549860

只需引用两次-(您在这里实际上没有太多问题)select a.product_id, a.part_id "part_a_id", b.part_id "part_b_id"from parts a, parts bwhere a.product_id = b.product_id
打开App,查看更多内容
随时随地看视频慕课网APP