在PostgreSQL中制表规范化数据

时间:2011-11-07 10:25:21

标签: sql postgresql

This问题类似于我需要做的事情,但投票的答案只能部分地解决问题。考虑一下这个表:

ID   |  TEST  |  RESULT
001  |  AAA   |  +
001  |  BBB   |  +
002  |  AAA   |  +
003  |  BBB   |  +

我想输出如下:

ID   |  AAA |  BBB
001  |  +   |  +
002  |  +   |  
003  |      |  +

我上面提到的解决方案提供了与其输出相同的数据,但不会“跳过”空列,就像003一样。因此,无法确定+结果所引用的测试。我正在使用PostgreSQL 8.4.9。

PS:纯SQL的解决方案是否可行?这需要在PL / pgSQL中编码吗?

1 个答案:

答案 0 :(得分:1)

对于快速而肮脏的解决方案,您可以使用:

SELECT DISTINCT 
T.ID,
(SELECT A.RESULT FROM MyTable A WHERE A.TEST = 'AAA' AND A.ID = T.ID) AS AAA,
(SELECT B.RESULT FROM MyTable B WHERE B.TEST = 'BBB' AND B.ID = T.ID) AS BBB
FROM MyTable T;

如果您需要更加动态,请考虑在SELECT中使用crosstab功能。