2011-10-19 16 views
5

Come si può trovare il massimo di più colonne create in una tabella pivot utilizzando una query della tabella pivot di SQL Server 2008?SQL max di più colonne nella tabella pivot

Data:

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 

l'istruzione Select di cui sopra ha il seguente risultato:

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

L'obiettivo è quello di avere il campo 'candidato di vincita' popolato con il nome di candidato che ha il maggior numero di voti nel campo NumVotes corrispondente.

+2

+1 Per fornire DDL utili per i risponditori. –

risposta

1

Per affrontare 8 modo concorsi più facilmente è possibile utilizzare CROSS APPLY e VALUES , potresti anche voler un GROUP BY come non hai detto come verranno gestiti i legami (questo restituirà più righe per ogni vincitore)

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

Funziona alla grande, grazie! Ora riguardo al gruppo per dichiarazione. Non riesco a capire come usarlo per restituire il "pareggio" nella colonna candidata vincente piuttosto che una riga aggiuntiva nella tabella pivot. – Sebastian

+0

@ user1003976 - Vedi modifica. –

+0

Bello. Grazie mille. – Sebastian

0

Se si tratta di solo alcuni campi è possibile utilizzare una dichiarazione CASE:

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

Prova una dichiarazione CASE:

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

Questo è un esempio semplificato. Avrei dovuto dire che ho alcune elezioni con 8 concorrenti, quindi speravo in un altro modo. – Sebastian

Problemi correlati