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 (True) または 0 (False) になるかどうかに応じて投票します。

助けてください。私は、Votes テーブル内でカーソルを移動することに勝るものはありませんでした。

Votes テーブルには既にデータが入力されているため、投票プロセスに影響を与えることはできません。

投票データ:

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 が除外されます。2 番目の選択は名前テーブルに結合し、非投票者も含めます。

于 2013-01-07T21:28:23.540 に答える