2016-08-22 66 views
0

我有一个3列,id,名称和投票表。他们有很多寄存器。我需要以最佳的选票余额返还登记册。投票类型是'是'和'否'。字符串出现的计算

是 - >加1 否 - >减1

此列票是一个字符串列。我正在使用SQL SERVER。

例子:

enter image description here

它必须返回

+1

请出示一些示例数据和预期的结果 – TheGameiswar

+0

好了,1分钟。我会在回答 – DiChrist

+0

,如果我的回答或其他人为你工作,请考虑接受它,让其他人知道你得到你需要的和声望点分配。感谢http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt

回答

3

使用条件聚合,可以进行投票的卡纳安在他的回答

建议如果你真的只需要1条记录,那么你可以像这样:

SELECT TOP 1 
    name 
    ,SUM(CASE WHEN vote = 'yes' THEN 1 ELSE -1 END) AS VoteTotal 
FROM 
    @Table 
GROUP BY 
    name 
ORDER BY 
    VoteTotal DESC 

这将不允许关系,但你可以使用这种方法将对响应进行排名并给出结果,使用RowNum仅获得1个结果或RankNum来获取关系。

;WITH cteVoteTotals AS (
    SELECT 
     name 
     ,SUM(CASE WHEN vote = 'yes' THEN 1 ELSE -1 END) AS VoteTotal 
     ,ROW_NUMBER() OVER (PARTITION BY 1 ORDER BY SUM(CASE WHEN vote = 'yes' THEN 1 ELSE -1 END) DESC) as RowNum 
     ,DENSE_RANK() OVER (PARTITION BY 1 ORDER BY SUM(CASE WHEN vote = 'yes' THEN 1 ELSE -1 END) DESC) as RankNum 
    FROM 
     @Table 
    GROUP BY 
     name 
) 

SELECT name, VoteTotal 
FROM 
    cteVoteTotals 
WHERE 
    RowNum = 1 
    --RankNum = 1 --if you want with ties use this line instead 

这里被使用的测试数据,并在将来不只是把你的测试数据的图像花2分钟,使一个临时表或表变量,以便你寻求帮助的人不不得不!

DECLARE @Table AS TABLE (id INT, name VARCHAR(25), vote VARCHAR(4)) 
INSERT INTO @Table (id, name, vote) 
VALUES (1, 'John','no'),(2, 'John','no'),(3, 'John','yes') 
,(4, 'Ann','no'),(5, 'Ann','yes'),(6, 'Ann','yes') 
,(9, 'Marie','no'),(8, 'Marie','no'),(7, 'Marie','yes') 
,(10, 'Matt','no'),(11, 'Matt','yes'),(12, 'Matt','yes') 
0

使用此代码,

;with cte as (
select id, name, case when vote = 'yes' then 1 else -1 end as votenum from register 
) select name, sum(votenum) from cte group by name 

您可以根据出这个获得最大的或最小..

+0

你不需要cte你可以在SUM()中包装转换,但这也不返回最佳纪录 – Matt

0

这一次给出了每个人的“是”率:

SELECT Name, SUM(CASE WHEN Vote = 'Yes' THEN 1 ELSE 0 END)/COUNT(*) AS Rate 
FROM My_Table 
GROUP BY Name 
相关问题