3

我有一张投票表,如下所示:

id, type, scope, region, UserId, ItemId, updatedAt, createdAt

我正在尝试根据赞成票/总票数按百分比计算排名靠前的项目。

最后一块是我想要一个用于两个时间戳之间WHERE的投票的条款。createdAt

我觉得这是一个非常正常的查询获取统计信息的事情。但我不知道该怎么做。

我得到的最接近的是:

SELECT "Votes"."ItemId", count("Votes"."ItemId") tots, count("Votes"."type" = 'up') AS yes, count("Votes"."type" = 'down') AS NO
FROM "Votes"
WHERE "Votes"."ItemId" IN (
    SELECT "Votes"."ItemId" FROM "Votes"
)
GROUP BY "Votes"."ItemId"

这与需要的东西相去甚远。因此,为什么我会在这里得到一些帮助。很难在这类东西上找到好的 sql 资源。

4

2 回答 2

2

您可以使用CASE语句对每个赞成票使用 1,对反对票使用 -1 并获得它们的总和

SELECT ItemId, SUM(CASE [type] WHEN 'up' THEN 1 WHEN 'down' THEN -1 END)
FROM Votes
WHERE createdAt >= 'startTime'
AND createdAt <= 'endTime'
GROUP BY ItemId
于 2015-05-20T05:07:31.040 回答
2

您可以使用条件聚合来做到这一点:

select itemid, 
       sum(case when type = 'up' then 1 else 0 end) up,
       sum(case when type = 'down' then 1 else 0 end) down,
       sum(1) total,
       100.0*sum(case when type = 'up' then 1 else 0 end)/sum(1) upperc,
       100.0*sum(case when type = 'down' then 1 else 0 end)/sum(1) downperc
from votes
group by itemid

小提琴http://sqlfiddle.com/#!15/1337d/6

于 2015-05-20T05:12:34.093 回答