2012-04-18 4 views
0

У меня есть таблица remarks с колоннами id, story_id, like как может быть +1, -1
Я хочу, чтобы мой select запроса возвращать следующие столбцы story_id, total, n_like, n_dislike где total = n_like + n_dislike без вложенных запросов.выбрать результирующий набор строк для преобразования столбцов

Я сейчас делаю group by на like и select ING like as like_t, count(like) as total, который дает мне выход, как

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

и возвращает две строки в наборе результатов. Но то, что я хочу, чтобы получить строку, в которой 1n_like is 6 и n_dislike является 2 и total является 8

ответ

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") для случаев, когда вы будете иметь +2 или -3 в вашем "like" колонке.

+0

Да, настоящее имя столбца не похоже, но проблема в том, что эти '+ 1',' -1' не являются целыми числами, они являются некоторыми типами enum. поэтому 'abs' и сумма не будет работать. только 'count' will.so just (CASE WHEN" like "> 0 THEN count (" like ") ELSE 0 END) AS n_like работает. Спасибо –

+0

Лучше использовать 'CASE WHEN" like "> 0 THEN 1 ELSE 0 END' для поля n_like. Кроме того, может быть, лучше сделать значения числовыми? – vyegorov

+0

Если '+ 1' и' -1' - единственные возможности, я должен назначить для него целый набор чисел? Запрос дает две строки для '+ like', где' n_like = n' и 'n_dislike = 0' и еще одна строка для' dislikes' где 'n_like = 0' и' n_dislike = n', но я хочу ее в одном row –

Смежные вопросы