2011-10-19 19 views
5

Jak znaleźć maksimum kilku kolumn tworzonych w tabeli przestawnej przy użyciu kwerendy tabeli przestawnej SQL Server 2008?SQL max wielu kolumn w tabeli przestawnej

Dane:

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 

Powyższy SELECT ma następujący wynik:

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

celem jest mieć pole "Zwycięstwo kandydata wypełnione nazwą kandydata, który ma najwięcej głosów w odpowiednim polu NumVotes.

+2

+1 Za udostępnienie użytecznego pliku DDL dla podmiotów udzielających odpowiedzi. –

Odpowiedz

1

do czynienia z 8 sposób konkursy łatwiej można użyć CROSS APPLY i VALUES , możesz również chcieć GROUP BY, ponieważ nie powiedziałeś, jak będą obsługiwane więzi (spowoduje to zwrócenie wielu wierszy dla każdego zwycięzcy)

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

Działa to świetnie, dzięki! Teraz o grupie przez wypowiedź. Nie mogę wymyślić, jak użyć tego, aby zwrócić "krawat" w kolumnie zwycięskiego kandydata, a nie dodatkowy wiersz w tabeli przestawnej. – Sebastian

+0

@ user1003976 - Zobacz edycję. –

+0

Piękny. Dzięki wielkie. – Sebastian

0

jeśli to tylko kilka pól można użyć instrukcji postępowania:

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

spróbować oświadczenie koperty:

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

To jest uproszczony przykład. Powinienem wspomnieć, że mam kilka wyborów z 8 zawodnikami, więc liczyłem na inny sposób. – Sebastian

Powiązane problemy