2015-05-20 195 views
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资源。

+0

你使用的是sql server或mysql或postgresql? – ughai

+1

为什么不使用1/-1来存储投票的上/下数以便让投票总数更容易?只是一个想法。 – Anthony

+0

我正在使用postgresql进行查询。 – corbanb

回答

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 
+0

这实际上是一个有趣的查询方式。我想我想要做的事情之一是取回项目数据,只是增加了上,下,总和百分比。我真的很喜欢这种方式选择他们的总和,所以即使添加这可能是非常好的。 – corbanb

+0

Giorgi Nakeuri的答案是我的完整版本,满足您的所有需求。你只需要添加'WHERE'子句 – sqluser

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

+0

这很棒。我越来越接近我现在希望的结果。 sum(case case WHEN type ='up'THEN 1 ELSE 0 end)up, sum(CASE WHEN type ='down'THEN 1 ELSE 0 end)down, sum(1)total, round(100.0 * sum(CASE WHEN type ='up'THEN 1 ELSE 0 end)/ sum(1),2)percent, sum(CASE WHEN type ='up'THEN 1 ELSE -1 end) FROM“投票“ WHERE”投票“。”createdAt“BETWEEN'2015-05-19T20:00:00 + 00:00'和'2015-05-20T00:00:00 + 00:00' GROUP BY”ItemId“令BY SUM DESC – corbanb

+0

谢谢@ giorgi-nakeuri这么多事情要学习。甚至不知道从哪里开始。 – corbanb

+0

有没有办法根据查询获得排名附加到这些?像1-100? – corbanb