Sql连接 - 根据Id将字段分成两个

时间:2015-04-16 05:18:24

标签: sql postgresql

我们说我们有一张桌子:

ID  |  ItemId  |  Value  |
1   |   201    |  Green  |
2   |   301    |  Wood   |
2   |   201    |  Red    |
4   |   201    |  Green  |
1   |   301    |  Iron   |

所以{ItemId:Type} - > {201:颜色},{301:材料}

有没有办法生成以下结果集?

ID |  Color  | Material  |
1  |  Green  | Iron      |
2  |  Red    | Wood      |
4  |  Green  | (null)    |

因此,根据ItemId,将Value放在第1列或第2列中。

2 个答案:

答案 0 :(得分:1)

您可以使用CASE...WHEN有选择地识别结果列来模拟数据透视表。你需要将它与一个聚合(它将去除NULL)结合起来,最后GROUP BY来压缩行:

SELECT ID, 
       MIN(CASE WHEN ItemId = 201 THEN Value ELSE NULL END) AS Color,
       MIN(CASE WHEN ItemId = 301 THEN Value ELSE NULL END) AS Material
FROM MyTable
GROUP BY ID
ORDER BY ID ASC;

SqlFiddle here

答案 1 :(得分:1)

您可以使用case根据Value值抓取ItemId,然后使用group by ID来聚合两行ID max 1}}在一个中,同时使用null(或其他聚合函数)排除select ID , max(case when ItemId = 201 then Value end) as Color , max(case when ItemId = 301 then Value end) as Material from tbl group by ID 值:

{{1}}