2012-04-18 39 views
0

我有一个表remarksid, story_id, like列等可以+1-1
我希望我的select查询返回下面的列story_id, total, n_like, n_dislike其中total = n_like + n_dislike无子查询。选择的结果集行的列变换

我目前likeselect荷兰国际集团like as like_t, count(like) as total这是给我像

-- like_t --+ --- total -- 
    -1  |  2 
    1  |  6 

的输出,并在返回结果集的两行做了group by。但我要的是得到1排在那里n_like is 6和n_dislike是2total8

回答

1

首先,LIKE是PostgreSQL中的保留字,所以你必须要仔细的报价吧。也许应该为这个专栏选择一个更好的名字。

CREATE TABLE testbed (id int4, story_id int4, "like" int2); 
INSERT INTO testbed VALUES 
    (1,1,'+1'),(1,1,'+1'),(1,1,'+1'), 
    (1,1,'+1'),(1,1,'+1'),(1,1,'+1'), 
    (1,1,'-1'),(1,1,'-1'); 

SELECT 
    story_id, 
    sum(CASE WHEN "like" > 0 THEN abs("like") ELSE 0 END) AS n_like, 
    sum(CASE WHEN "like" < 0 THEN abs("like") ELSE 0 END) AS n_dislike, 
    count(story_id) AS total 
    -- for cases +2/-3 in the "like" field, use following construct instead 
    -- sum(abs("like")) AS total 
    FROM testbed 
GROUP BY story_id; 

我用abs("like")的情况下,当你在你的"like"列有+2-3

+0

是的真正的列名不是,但问题是这些'+ 1','-1'不是整数,它们是一些'enum'类型。所以'abs'和总和将不起作用。只有'count' will.so just(CASE WHEN“like”> 0 THEN count(“like”)ELSE 0 END)as n_like works。谢谢 – 2012-04-18 07:03:38

+0

更好地使用'CASE WHEN',就像“> 0 THEN 1 ELSE 0 END'这个n_like字段。另外,也许最好是使数值为数字? – vyegorov 2012-04-18 07:08:37

+0

如果'+ 1'和'-1'是唯一的可能性,我应该将整个'numeric'赋值给它吗?这个查询给出了两行'+ like',其中'n_like = n'和'n_dislike = 0',另一行'dislikes'其中'n_like = 0'和'n_dislike = n',但是我想要它在一个行 – 2012-04-18 07:16:25