2011-10-19 21 views
5

¿Cómo puede encontrar el máximo de varias columnas que se crean en una tabla dinámica utilizando una consulta de tabla dinámica de SQL Server 2008?SQL máximo de varias columnas en la tabla pivote

Dado:

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 

la instrucción SELECT anterior tiene el siguiente resultado:

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

El objetivo es tener el campo 'candidato ganador' poblada con el nombre del candidato que tiene más votos en el campo NumVotes correspondiente.

+2

+1 Para proporcionar DDL útil para contestadores. –

Respuesta

1

Para hacer frente a 8 vías concursos más fácilmente se puede utilizar CROSS APPLY y VALUES , también puede querer un GROUP BY ya que no ha dicho cómo se manejarán los vínculos (esto devolverá varias filas para cada ganador)

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

Esto funciona genial, gracias! Ahora sobre el grupo por declaración. No puedo entender cómo usar eso para devolver "empate" en la columna de candidato ganador en lugar de una fila adicional en la tabla dinámica. – Sebastian

+0

@ user1003976 - Ver edición. –

+0

Hermoso. Muchas gracias. – Sebastian

0

Si se trata de sólo unos pocos campos se puede utilizar una instrucción CASE:

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

Pruebe una instrucción CASE:

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

Este es un ejemplo simplificado. Debería haber mencionado que tengo algunas elecciones con 8 concursantes, así que esperaba otra forma. – Sebastian

Cuestiones relacionadas