2013-01-07 44 views
0

我開發算法來排序原始投票時卡住了。該票表看起來像這樣:Transact-SQL排名(排序)原始投票

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

FirstNameId和SecondNameId是相同的名稱表的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 

從名稱表數據的樣本:

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

Paul,是否可以看到VOTES和NAME表的小樣本數據集以及預期輸出的示例?謝謝。 – MarkD

+0

當然,我已經更新了這個問題。 – Paul

+0

保羅,它仍然不清楚你需要的輸出是什麼。 – MarkD

回答

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; 

的第一選擇排除NameIds。第二個選擇連接到名稱表並且也包含非投票。

+0

「第一個選擇不包括完全沒有投票的NameIds」。不完全是。所有的名字都應該在列表中。如果第一個名字在第二個名字後面的列表中,並且用戶已經投票給了名字,那麼第一個名字應該被移動到第二個名字之前的位置。所以,它應該是像使用特殊類型的原始數據和僅使用SQL語句進行冒泡排序的東西。 – Paul

+0

然後使用第二個選擇。它包含結果中的所有名稱。 –