2012-04-27 88 views
5

我有一个表,看起来像这样:如何透视和计算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 ; 

欲枢轴转动而离开A/B/C,然后计数2秒的数量和具有总的2的百分比。

我可以得到2秒的数量与此查询

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; 

但我真的希望它看起来是这样的:

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

如何获得总计并计算百分比?

谢谢!

+0

你接受不返回正确的结果:( – 2012-04-27 20:18:05

+0

嗨约翰的解决方案,我被锁了由于某种原因,这里是我的评论Hi Lamak,那。使用错误的总数来计算百分比,因为AI需要总数为5,所以总数的百分比是2 = 2/5 = 40%。对于B,它将是1/5 = 20% – user918967 2012-04-27 21:29:45

回答

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; 

结果:

enter image description here