преобразование из длинного набора данных в широкий набор данных в SQL с произвольным числом групповых переменных - PullRequest
2 голосов
/ 29 июня 2011

Предположим, что вы неоднократно измеряли людей в течение времени, отображаемого по вертикали, и вы хотите преобразовать его в широкий дисплей, например, из

family | year | salary
fam1   | 2002 | 80
fam1   | 2003 | 82
fam1   | 2008 | 90
fam2   | 1996 | 45
fam3   | 2002 | 70
fam3   | 2003 | 72

в

family | salary1996 | salary2002 | salary2003 | salary2008
fam1   | 45         | .          | .          | .
fam2   | .          | 80         | 82         | 90
fam3   | .          | 70         | 72         | .

Проблема в том, чтосуществует произвольное количество возможных значений для "года".

1 Ответ

3 голосов
/ 29 июня 2011

Если вы используете SQL Server, это то, что вы ищете:

Обновление

Все еще предполагая, что вы используете SQL Server 2005 или выше, вот код:

DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)

SELECT  @cols = STUFF(( SELECT distinct  '], [' + cast([year] as varchar)
                        FROM YourTable FOR XML PATH('') ), 1, 2, '') + ']'


SET @sqlquery = 'SELECT * FROM
      (SELECT family,  [year], [salary]
       FROM YourTable) base
       PIVOT (SUM(salary) FOR [year]
       IN (' + @cols + ')) AS finalpivot'

EXECUTE ( @sqlquery )
...