2017-11-11 53 views
0

刪除重複我有需要具有其值期間轉換爲列的查詢數據:postgres的:交叉並在查詢

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

如何我可以寫我的查詢,使用交叉表或沒有它,使重複被刪除?

+1

它是MySQL的Postgres的嗎? –

+0

使用sum(CASE WHEN s.stat_id = 1 THEN s.base_stat END)作爲「hp」,其他列也相似。 –

+0

嗨。爲文本使用文本 - [不要使用圖像/鏈接](https://meta.stackoverflow.com/q/285551/3404097)。閱讀並執行[mcve]。你有什麼嘗試? – philipxy

回答

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

試試這個

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