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 中编码?
最佳答案
对于一个快速而肮脏的解决方案,你可以使用这个:
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;
如果您需要更多动态,请考虑使用 crosstab
SELECT
中的函数。
关于sql - 在 PostgreSQL 中制表规范化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8035153/