postgres:交叉表并删除查询重复项

时间:2017-11-11 05:54:41

标签: mysql postgresql

我的数据需要在查询期间将其值转换为

SELECT p.*,
CASE WHEN s.stat_id=1 THEN s.base_stat END AS "hp",
CASE WHEN s.stat_id=2 THEN s.base_stat END AS "attack",
CASE WHEN s.stat_id=3 THEN s.base_stat END AS "defense",
CASE WHEN s.stat_id=4 THEN s.base_stat END AS "special_attack",
CASE WHEN s.stat_id=5 THEN s.base_stat END AS "special_defense",
CASE WHEN s.stat_id=6 THEN s.base_stat END AS "speed"
FROM pokemon_stats s
INNER JOIN pokemon p on s.pokemon_id=p.id

给出了:

duplicate values

在表pokemon_stats中,每个统计信息都会分别存在一个新行。

duplicate stats

如何使用交叉表或不使用交叉表来编写查询,以便删除重复项?

2 个答案:

答案 0 :(得分:2)

使用crosstab功能:

首先,安装tablefunc module

CREATE EXTENSION IF NOT EXISTS tablefunc;

SELECT *
FROM pokemon p
JOIN crosstab('SELECT 
                   pokemon_id
                 , stat_id
                 , base_stat
               FROM pokemon_stats
               WHERE stat_id IN (1,2,3,4,5,6)
               ORDER BY 1, 2') xtab (id integer
                                   , hp integer
                                   , attack integer
                                   , defense integer
                                   , special_attack integer
                                   , special_defense integer
                                   , speed integer) 
     USING (id)

答案 1 :(得分:1)

试试这个

SELECT p.id, p.identifier, p.species_id, p.height, p.weight, p.base_experience, p.order ,p.is_default,
sum(CASE WHEN s.stat_id=1 THEN s.base_stat END) AS "hp",
sum(CASE WHEN s.stat_id=2 THEN s.base_stat END) AS "attack",
sum(CASE WHEN s.stat_id=3 THEN s.base_stat END) AS "defense",
sum(CASE WHEN s.stat_id=4 THEN s.base_stat END) AS "special_attack",
sum(CASE WHEN s.stat_id=5 THEN s.base_stat END) AS "special_defense",
sum(CASE WHEN s.stat_id=6 THEN s.base_stat END) AS "speed"
FROM pokemon_stats s
INNER JOIN pokemon p on s.pokemon_id=p.id
group by 
p.id, p.identifier, p.species_id, p.height, p.weight, p.base_experience, p.order ,p.is_default