2011-10-19 8 views
5

SQL Server 2008のピボットテーブルクエリを使用してピボットテーブルに作成された複数の列の最大値を確認するにはどうすればよいですか?ピボットテーブル内の複数のSQLの最大値

create table ElectionResults_test 
(
    Total_Votes int, 
    Precinct_Name varchar(50), 
    Candidate_Name varchar(50) 
) 
insert into ElectionResults_test values (4,'CP01', 'DOUG') 
insert into ElectionResults_test values (2,'CP02', 'DOUG') 
insert into ElectionResults_test values (2,'CP01', 'LATHE') 
insert into ElectionResults_test values (4,'CP02', 'LATHE') 


    SELECT Precinct_Name as ConsPrecinct_Name, 'DOUG' AS Candidate1, [DOUG] AS NumVotes1, 
    'LATHE' AS Candidate2, [LATHE] AS NumVotes2, 'Needs Data' as WinningCandidate FROM 
    (Select Total_Votes, Precinct_Name, Candidate_Name from [ELECTIONRESULTS_test]) 
    as SourceTable pivot (sum(Total_Votes) for Candidate_Name in ([DOUG], [LATHE])) as PivotTable 

上記のselect文は、次の出力があります:

ConsPrecinct_name Candidate1 NumVotes1 Candidate2 NumVotes2 Winning Candidate 
CP01    DOUG  4   LATH  2   Needs Data 
CP01    DOUG  2   LATH  4   Needs Data 

目標は、最も多くの票を持っている候補者名が取り込ま「優勝候補」フィールドを持つことである考える

対応するNumVotesフィールドに入力します。

+2

+1回答者に有用なDDLを提供するため。 –

答えて

1

より簡単にあなたがCROSS APPLYVALUESを使用することができます8回のウェイのコンテストに対処するにはまた、どのようにタイが処理されるかについても言及していないので、GROUP BYが必要になることがあります(これは各受賞者ごとに複数の行を返します)

SELECT Precinct_Name   AS ConsPrecinct_Name, 
     'DOUG'     AS Candidate1, 
     [DOUG]     AS NumVotes1, 
     'LATHE'    AS Candidate2, 
     [LATHE]    AS NumVotes2, 
     WinningCandidate.name AS WinningCandidate 
FROM (SELECT Total_Votes, 
       Precinct_Name, 
       Candidate_Name 
     FROM ElectionResults_test) AS SourceTable PIVOT (SUM(Total_Votes) FOR 
     Candidate_Name IN ([DOUG], [LATHE])) AS PivotTable 
CROSS APPLY (SELECT CASE 
          WHEN COUNT(*) = 1 THEN MAX(name) 
          ELSE 'Tie' 
          END AS name 
        FROM (SELECT TOP 1 WITH TIES name 
          FROM (VALUES('DOUG', [DOUG]), 
              ('LATHE', [LATHE])) Y(name, votes) 
          ORDER BY votes DESC) T)AS WinningCandidate 
+0

これはすばらしい、ありがとう!グループバイステートメントについて私はピボットテーブルの追加の行ではなく、勝利候補の列に "同点"を返すためにそれを使用する方法を理解できません。 – Sebastian

+0

@ user1003976 - 編集を参照してください。 –

+0

美しい。本当にありがとう。 – Sebastian

0

それはあなたがCASEステートメントを使用することができる一部のフィールドだけだ場合:

... 
CASE WHEN NumVotes1 > NumVotes2 THEN Candidate1 
    WHEN NumVotes2 > NumVotes1 THEN Candidate2 
    ELSE 'TIE' END as WinningCandidate 
1

CASE文を試してみてください。

CASE WHEN [DOUG] > [LATHE] THEN 'DOUG' 
    WHEN [DOUG] < [LATHE] THEN 'LATHE' 
    ELSE 'No winner' 
END AS WinningCandidate 
+0

これは簡単な例です。私は8人の選手と選挙をしているということを言及すべきだったので、私は別の方法を望んでいた。 – Sebastian

関連する問題