我有一张选票,每个选民从 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)
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)