2016-08-11 12 views
1

ではありません記録を持っている場合は、SQLがレコードを返します。でも、それは私が次の表の構造をした別の表

候補:

CandidateId - CandidateName - Symbol 
     2000 - Hillary - Mobile 
     2001 - Trumph - Car 
     2002 - Jackson - Laptop 

CastVote:

 ID - VotedId - CandidateSymbol 
     1 - 234BB12344MK23468 - 2000 
     2 - 234BB12344MK23469 - 2000 
     2 - 234BB12344MK23470 - 2000 
     2 - 234BB12344MK23471 - 2002 

ので、出力は次のようになり次のようになります。

ID - Candidate - Votes - Status 
1 - 2000 - 3 - Winner 
2 - 2001 - 0 - Loser 
3 - 2002 - 1 - Loser 

同じ候補者が同じ場合、出力はこのようになります。

ID - Candidate - Votes - Status 
    1 - 2000 - 2 - Winner 
    2 - 2001 - 1 - Loser 
    3 - 2002 - 2 - Winner //Returns 1 even it has no record in the **CastVote** table 

使用される:私は正常に動作しますが、候補者は、任意の投票キャストを持っていない場合、それは1として、その候補者に投票数を返す次のクエリを使用しました

ID - Candidate - Votes - Status 
1 - 2000 - 2 - Winner 
2 - 2001 - 0 - Loser 
3 - 2002 - 2 - Winner 

:投票の次のクエリ:

WITH MyCTE AS (
       SELECT k.CandidateName, k.Symbol, COUNT(*) AS Votes 
        FROM CastVote m 
     FULL OUTER JOIN Candidate k 
        ON k.CandidateId = m.CandidateSymbol 
       GROUP BY CandidateSymbol, k.CandidateName, k.Symbol 
       ) 
    SELECT Symbol, CandidateName, Votes,CASE 
     WHEN DENSE_RANK() 
     OVER (ORDER BY Votes DESC) = 1 
     THEN 'Winner' ELSE 'Loser' END Status 
     FROM MyCTE 
+0

あなたは、このリンクをチェックして、より多くのclarity..httpsを得るためにあなたの質問を改善しようとしてくださいでき://spaghettidba.com/2015/04/24/how-to-post-at-sql-question- on-a-public-forum/ – TheGameiswar

+0

完全外部結合のために問題が発生している可能性があります。結果セットは '候補'、null、null、nullのようなものになります。その候補が存在するため、その候補の数は1にすぎません...可能な解決策はいくつかありますが、単純な解決策はCOUNT(*) COUNT(votes)(実際にvoteテーブルのnullでない列に "votes"を置き換えます) – ZLK

答えて

1

共通テーブル式は、本当に私たちは離れて、各候補者のためのstatusを決定するために、本当に醜いサブクエリであったであろう何をどうすることができ、ここで一日を保存します。多くの場合、ネクタイを扱うことができないのは問題ですが、複数の勝者を持つことであなたの問題は解決します。その場合、投票数が最も多い候補者が複数存在することを心配する必要はありません。

WITH Votes_CTE (CandidateSymbol, Votes) 
AS 
(
    SELECT CandidateSymbol, COUNT(*) AS Votes 
    FROM CastVote 
    GROUP BY CandidateSymbol 
) 

SELECT t1.ID, 
     t1.CandidateId AS Candidate, 
     t2.Votes, 
     CASE WHEN t2.Votes = (SELECT MAX(Votes) FROM Votes_CTE) 
      THEN 'Winner' 
      ELSE 'Loser' END AS Status 
FROM Candidate t1 
LEFT JOIN Votes_CTE t2 
    ON t1.CandidateId = t2.CandidateSymbol