2012-04-27 14 views
5

mam tabeli, która wygląda następująco:Jak przestawić i obliczyć wartości procentowe w 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 ; 

że ma obracać się A/B/C, a następnie policzyć 2s i mają procentową całkowitą od 2 jest.

mogę uzyskać liczbę 2s z tego zapytania

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; 

ale naprawdę chcę to wyglądać tak:

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

Jak mogę uzyskać sumy i obliczyć procenty?

Dzięki!

+0

Rozwiązanie przyjęliście nie zwraca poprawny wynik :( –

+0

Cześć Wojtek, mam zablokowany z jakiegoś powodu Tu był mój komentarz Hi Lamak, To.. W celu uzyskania wartości procentowych używa się niewłaściwej sumy. W przypadku AI potrzeba w sumie 5, więc wartości procentowe całości wynoszą 2 = 2/5 = 40% Dla B wynosiło 1/5 = 20% – user918967

Odpowiedz

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; 

Wynik:

enter image description here