2012-04-27 3 views
5

Ho una tabella che assomiglia a questo:Come ruotare e calcolare le percentuali in 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 ; 

voglio girare al largo della A/B/C e poi contare il numero di 2s e hanno la percentuale del totale del 2 è.

posso ottenere il numero di 2s con questa query

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; 

Ma voglio davvero farlo sembrare come questo:

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

Come posso ottenere i totali e calcolare le percentuali?

Grazie!

+0

La soluzione è stata accettata non restituisce il risultato corretto :( –

+0

Ciao John, mi sono bloccato per qualche motivo Qui è stato il mio commento Hi Lamak, che.. usa il totale sbagliato per ricavare le percentuali. Per AI è necessario un totale di 5 quindi le percentuali del totale che sono 2 = 2/5 = 40% per B sarebbe 1/5 = 20% – user918967

risposta

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; 

Risultato:

enter image description here