2012-04-27 29 views
5

Tengo una tabla que tiene este aspecto:¿Cómo pivotar y calcular porcentajes en t-sql?

DECLARE @myTable TABLE (country varchar(max), code int) 
    INSERT @myTable 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 2 UNION ALL 
    SELECT 'A', 2 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 2 UNION ALL 
    SELECT 'C', 1 UNION ALL 
    SELECT 'C', 1 UNION ALL 
    SELECT 'C', 1 ; 

Quiero pivote de la A/B/C y luego contar el número de 2s y tienen el porcentaje del total del 2 es.

puedo obtener el número de 2s con esta consulta

DECLARE @mySecondTable TABLE (country varchar(max), code int); 
    INSERT @mySecondTable 
     SELECT * FROM @myTable 
     WHERE code=2; 

    SELECT [A], [B], [C] 
    FROM 
    (SELECT Country, code 
     FROM @mySecondTable) AS source 
    PIVOT 
    (
     COUNT(code) 
     FOR Country IN ([A], [B], [C])) AS pvt; 

Pero realmente quiero que se vea como esto:

A   B   C 
    2 (40.0%) 1 (20.0%) 0 

¿Cómo puedo obtener los totales y calcular los porcentajes?

Gracias!

+0

La solución que aceptó no devuelve el resultado correcto :( –

+0

Hola Juan, tengo bloqueado por alguna razón Aquí estaba mi comentario Hola Lamak, Que.. usa el total incorrecto para hacer los porcentajes. Para AI necesita un total de 5, entonces los porcentajes del total que son 2 = 2/5 = 40% para B sería 1/5 = 20% – user918967

Respuesta

2
DECLARE @myTable TABLE (country varchar(max), code int) 
    INSERT @myTable 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 1 UNION ALL 
    SELECT 'A', 2 UNION ALL 
    SELECT 'A', 2 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 1 UNION ALL 
    SELECT 'B', 2 UNION ALL 
    SELECT 'C', 1 UNION ALL 
    SELECT 'C', 1 UNION ALL 
    SELECT 'C', 1 ; 

    DECLARE @mySecondTable TABLE (country varchar(10), pct varchar(20), code int); 
    INSERT @mySecondTable 
     SELECT country 
     , pct=cast(count(*)over(partition by country,code) as varchar(10)) 
      +' ('+cast(100* 
       cast(count(*)over(partition by country,code)as decimal(3,2)) 
       /CAST(count(*)over(partition by country) as decimal(3,2)) as varchar(10)) 
      +'%)' 
     , code 
     FROM @myTable 

    SELECT [A], [B], [C] 
    FROM 
    (SELECT Country, pct 
     FROM @mySecondTable 
     WHERE code=2 
    ) AS source 
    PIVOT 
    (
     MAX(pct) 
     FOR Country IN ([A], [B], [C])) AS pvt; 

Resultado:

enter image description here

Cuestiones relacionadas