2014-11-24 40 views
1

我正在使用PostgreSQL 8.4。若要计算有关约束的总和

我有以下SQL查询:

SELECT p.partner_id, 
CASE WHEN pa.currency_id = 1 THEN SUM(amount) ELSE 0 END AS curUsdAmount, 
CASE WHEN pa.currency_id = 2 THEN SUM(amount) ELSE 0 END AS curRubAmount, 
CASE WHEN pa.currency_id = 3 THEN SUM(amount) ELSE 0 END AS curUahAmount 
FROM public.player_account AS pa 
JOIN player AS p ON p.id = pa.player_id 
WHERE p.partner_id IN (819) 
GROUP BY p.partner_id, pa.currency_id 

的事情是,查询没有我所期待的。我意识到这一点,但现在我想了解那个查询究竟做了什么。我的意思是,执行查询之后将会计算什么SUM。你能澄清吗?

+1

你可能想'SUM(CASE WHEN pa.currency_id = 1,则相当于ELSE 0 END)AS curUsdAmount' – 2014-11-24 17:00:25

+0

@juergend是的,绝对,但什么sum的计算与我的sql脚本。 – 2014-11-25 07:53:23

回答

2

我觉得你的条件向后查询:

SELECT p.partner_id, 
     SUM(CASE WHEN pa.currency_id = 1 THEN amount ELSE 0 END) AS curUsdAmount, 
     SUM(CASE WHEN pa.currency_id = 2 THEN amount ELSE 0 END) AS curRubAmount, 
     SUM(CASE WHEN pa.currency_id = 3 THEN amount ELSE 0 END) AS curUahAmount 
FROM public.player_account pa JOIN 
    player p 
    ON p.id = pa.player_id 
WHERE p.partner_id IN (819) 
GROUP BY p.partner_id; 

注意,我还从group by条款删除currency_id

+0

是的,这就是我正在寻找的。但是,难道你不能解释我在脚本中计算的总和吗?我想我计算所有商店的总和并将其替换为0,如果...... – 2014-11-25 07:56:29

0

也许一行(partner_id, currency_id)做这项工作。更快和更清洁的那样:

SELECT p.partner_id, pa.currency_id, sum(amount) AS sum_amount 
FROM player_account pa 
JOIN player p ON p.id = pa.player_id 
WHERE p.partner_id = 819 
AND pa.currency_id IN (1,2,3) -- may be redundant if there are not other 
GROUP BY 1, 2; 

如果你需要每partner_id 1行,你实际上是在寻找“交叉表”或“数据透视表”。在Postgres中使用crosstab()来自附加模块tablefunc,这是非常快。 (也可用于过时版本8.4):

SELECT * FROM crosstab(
    'SELECT p.partner_id, pa.currency_id, sum(amount) 
    FROM player_account pa 
    JOIN player p ON p.id = pa.player_id 
    WHERE p.partner_id = 819 
    AND pa.currency_id IN (1,2,3) 
    GROUP BY 1, 2 
    ORDER BY 1, 2' 

    ,VALUES (1), (2), (3)' 
    ) AS t (partner_id int, "curUsdAmount" numeric 
         , "curRubAmount" numeric 
         , "curUahAmount" numeric); -- guessing data types 

适应您的实际数据类型。

详细说明: