Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to pivot and calculate percentages in t-sql?

I have a table that looks like this:

    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 ;

I want to pivot off the A/B/C and then count the number of 2s and have the percentage of the total the 2 is.

I can get the number of 2s with this 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;

But I really want it to look like this:

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

How do I get the totals and calculate the percentages ?

Thanks!

like image 306
user918967 Avatar asked Apr 27 '12 18:04

user918967


1 Answers

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;

Result:

enter image description here

like image 113
John Dewey Avatar answered Oct 14 '22 15:10

John Dewey