我有一个3列,id,名称和投票表。他们有很多寄存器。我需要以最佳的选票余额返还登记册。投票类型是'是'和'否'。字符串出现的计算
是 - >加1 否 - >减1
此列票是一个字符串列。我正在使用SQL SERVER。
例子:
它必须返回安我
我有一个3列,id,名称和投票表。他们有很多寄存器。我需要以最佳的选票余额返还登记册。投票类型是'是'和'否'。字符串出现的计算
是 - >加1 否 - >减1
此列票是一个字符串列。我正在使用SQL SERVER。
例子:
它必须返回安我
使用条件聚合,可以进行投票的卡纳安在他的回答
建议如果你真的只需要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')
使用此代码,
;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
您可以根据出这个获得最大的或最小..
你不需要cte你可以在SUM()中包装转换,但这也不返回最佳纪录 – Matt
这一次给出了每个人的“是”率:
SELECT Name, SUM(CASE WHEN Vote = 'Yes' THEN 1 ELSE 0 END)/COUNT(*) AS Rate
FROM My_Table
GROUP BY Name
请出示一些示例数据和预期的结果 – TheGameiswar
好了,1分钟。我会在回答 – DiChrist
,如果我的回答或其他人为你工作,请考虑接受它,让其他人知道你得到你需要的和声望点分配。感谢http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – Matt