2013-08-23 2 views
1

У меня есть эта таблица:GroupBy с помощью PIVOT

Person Job 
PersonA XX 
PersonA XX 
PersonA XX 
PersonB XX 
PersonB XX 
PersonB YY 
PersonB ZZ 
PersonC XX 
PersonC XX 
PersonA XX 
PersonA YY 
PersonB ZZ 
... 

Теперь я хочу выход быть что-то вроде этого:

Job PersonA PersonB Person C 
XX 4  2  2 
YY 1  1  0 
ZZ 0  2  0 

До сих пор у меня есть это:

SELECT DISTINCT Person, 
         (SELECT COUNT(Job) 
         FROM dbo.TableName 
         GROUP BY Job) 
FROM dbo.ExcelImport 

Не повезло :(

+0

Не могли бы Вы не адресовать это в 'table' или нормализующих данных? – Jakub

+1

Постарайтесь смотреть на функции поворота, некоторые ссылки: http://stackoverflow.com/questions/13031846/manipulate-results-to-display-rows-as-columns http://stackoverflow.com/questions/ 12074939/get-rows-as-columns-sql-server-dynamic-pivot-query – JsonStatham

+0

@SelectDistinct: Хорошо! –

ответ

3

Вы можете попробовать что-то вроде этого:

select 
    Job 
    ,SUM(case when Person = 'PersonA' 
     then 
      1 
     else 
      0 
    end) as 'PersonA' 
    ,SUM(case when Person = 'PersonB' 
     then 
      1 
     else 
      0 
    end) as 'PersonB' 
    ,SUM(case when Person = 'PersonC' 
     then 
      1 
     else 
      0 
    end) as 'PersonC' 
from 
    TableName 
group by 
    Job 
+0

Удивительный! То, что я искал :) –

2

Это простая задача для pivot оператора:

select * 
from (select Job as Job2, * from [TableName]) t 
    pivot (count(Job2) for Person in ([PersonA],[PersonB],[PersonC])) p 
0

вы можете использовать шарнирные слишком

select * from per 
pivot (count(job) for job in ([xx],[yy],[zz])) 
0

Попробуйте это, если лица фиксировано

SELECT * FROM Table1 
PIVOT 
(
    COUNT([Person]) FOR [Person] IN ([PersonA],[PersonB],[PersonC]) 
) p 

SQL FIDDLE DEMO

Если человек изменяются в то попробуйте этот динамический запрос

DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX) 
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME([Person]) 
        from Table1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @query = 'SELECT [Job],' + @cols + ' 
      FROM 
      (
       Select * 
       FROM Table1 
      ) T 
      PIVOT 
      (
       COUNT([Person]) 
       FOR [Person] IN (' + @cols + ') 
      ) pvt ' 

EXECUTE(@query); 
Смежные вопросы