合计投票结果

Tom*_*Tom 5 sql-server count

我有一张选票,每个选民从 10 位不同的候选人中选出 3 票。第 1 票得 3 分,第 2 票得 2 分,第 3 票得 1 分。

我有以下 SQL 查询来计算从每张投票中获得的总分(因此将投票 1、2 和 3 的结果分开)。

我需要做的是将所有这些结果放在一个表中,但我不太确定从哪里开始。

SELECT cn.cand_name, (count(vote_1) * 3) as vote_1 FROM candidate_votes cv Inner Join candidate_names cn ON cv.vote_1 = cn.cand_number GROUP BY cand_name;

SELECT cn.cand_name, (count(vote_2) * 2) as vote_2 FROM candidate_votes cv Inner Join candidate_names cn ON cv.vote_2 = cn.cand_number GROUP BY cand_name;

SELECT cn.cand_name, (count(vote_3) * 1) as vote_3 FROM candidate_votes cv Inner Join candidate_names cn ON cv.vote_3 = cn.cand_number GROUP BY cand_name;
Run Code Online (Sandbox Code Playgroud)

我有以下结果表:

Voter_number    Vote_1     Vote2      Vote3
123             cand_1     cand_3     cand_2
456             cand_2     cand_1     cand_3
789             cand_2     cand_3     cand_1
Run Code Online (Sandbox Code Playgroud)

以及以下候选名称表:

cand_number     cand_name
cand_1          Dave
cand_2          Sarah
cand_3          Nigel
Run Code Online (Sandbox Code Playgroud)

所以我正在寻找的结果将类似于:

Candidate       Votes
Dave            6
Sarah           7
Nigel           5
Run Code Online (Sandbox Code Playgroud)

ype*_*eᵀᴹ 3

SELECT cn.cand_name
     , COALESCE(cv1.cnt_1,0)
     , COALESCE(cv2.cnt_2,0)
     , COALESCE(cv3.cnt_3,0)
     , 3*COALESCE(cv1.cnt_1,0) + 2*COALESCE(cv2.cnt_2,0)
       + 1*COALESCE(cv3.cnt_3,0) AS total
FROM candidate_names AS cn
  LEFT JOIN 
    ( SELECT vote_1 AS vote
           , COUNT(*) AS cnt_1
      FROM candidate_votes cv
      GROUP BY vote_1
    ) AS cv1
    ON cv1.vote = cn.cand_number
  LEFT JOIN 
    ( SELECT vote_2 AS vote
           , COUNT(*) AS cnt_2
      FROM candidate_votes cv
      GROUP BY vote_2
    ) AS cv2
    ON cv2.vote = cn.cand_number
  LEFT JOIN 
    ( SELECT vote_3 AS vote
           , COUNT(*) AS cnt_2
      FROM candidate_votes cv
      GROUP BY vote_3
    ) AS cv3
    ON cv3.vote = cn.cand_number
Run Code Online (Sandbox Code Playgroud)