0

我在开发一种算法来对原始选票进行排序时遇到了困难。投票表如下所示:

CREATE TABLE [dbo].[Votes](
  RecordId int IDENTITY(1,1) NOT NULL,
  FirstNameId int NOT NULL,
  SecondNameId int NOT NULL,
  FirstPreferred bit NULL)

FirstNameId 和 SecondNameId 是对同一个 Names 表的 PK 的引用。用户对名字或名字成对投票,具体取决于 FirstPreferred 列取 1(真)或 0(假)。

请帮忙。我真的没有比在投票表中移动光标更好的办法了。

投票表已经填满了数据,所以我不能影响投票过程。

投票数据:

RecordId  FirstNameId  SecondNameId  FirstPreferred
   1          41            60            0
   2          49           108            0
   3         110           118            0
   4          35            41            0
   5          15           100            0
   6          12            74            1
   7          16           122            1
   8          46           118            0
   9          46           105            1
  10          93           117            0

Names 表中的数据样本:

NameId    Name
  5      Nicolas
  6      Sergio
 11      Alexander
 12      Alexei
 13      Albert
 15      Anatoly
 16      Andreas
4

1 回答 1

1

如果我理解正确,您想计算每个名字被投票的频率,然后输出按该计数排序的结果?如果是这样,你可以使用这个:

CREATE TABLE dbo.Names(
  NameId INT,
  FullName NVARCHAR(20)
)
CREATE TABLE [dbo].[Votes](
  RecordId int IDENTITY(1,1) NOT NULL,
  FirstNameId int NOT NULL,
  SecondNameId int NOT NULL,
  FirstPreferred bit NULL)
GO
INSERT INTO dbo.Names
VALUES(1,'p1'),
      (2,'p2'),
      (3,'p3'),
      (4,'p4');


INSERT INTO dbo.Votes
VALUES (1,2,1),
       (1,3,1),
       (1,4,0),
       (2,3,1),
       (2,4,0),
       (3,4,0);

WITH VotedNames AS(       
SELECT CASE WHEN FirstPreferred = 1
            THEN FirstNameId
            ELSE SecondNameId
       END AS NameId
FROM dbo.Votes
)
SELECT NameId, COUNT(1) AS Votes
FROM VotedNames
GROUP BY NameId
ORDER BY Votes DESC;


WITH VotedNames AS(       
SELECT CASE WHEN FirstPreferred = 1
            THEN FirstNameId
            ELSE SecondNameId
       END AS NameId
FROM dbo.Votes
)
,VoteCounts AS(
SELECT NameId, COUNT(1) AS Votes
FROM VotedNames
GROUP BY NameId
)
SELECT n.*,ISNULL(v.Votes,0) AS Votes
FROM dbo.Names AS n
LEFT JOIN VoteCounts AS v
ON n.NameId = v.NameId
ORDER BY v.Votes DESC;

第一个选择排除了根本没有投票的 NameId。第二个选择连接到名称表,也包括非投票者。

于 2013-01-07T21:28:23.540 回答