2017-01-25 2 views
1

Привет У меня есть данные в таблице, как это:SQL PIVOT сервер

Herd | Tag | Byr | Mob | Date  | Trait | Value 
-----|-----|-----|-----|-------------|-------|------- 
6002 | 1/08| 2008| 1 | 2015-08-17 | LWT | 425 
6002 | 1/08| 2008| 3 | 2015-12-22 | LWT | 516 
6002 | 1/08| 2008| 4 | 2016-04-06 | LWT | 688 

мне нужно изменен с Долго широкоэкранного с использованием функции PIVOT

Herd | Tag | Byr | Mob | 2015-08-17 | Mob | 2015-12-22 | Mob | 2016-04-06 
-----|-----|-----|-----|------------|-----|------------|-----|------------ 
6002 | 1/08| 2008| 1 | 425  | 3 | 516  | 4 | 688 

Любая помощь будет высоко оценили

+0

У меня также есть несколько дат (сотни). – proctor

ответ

1

Вот Dynamic Pivot для нескольких столбцов

Declare @SQL varchar(max) 
Set @SQL = Stuff((Select Distinct ',' +QuoteName(concat('Mob_',Date))+' as Mob,'+QuoteName(Date) 
        From Yourtable 
        Order by 1 
        For XML Path('')),1,1,'') 

Select @SQL = ' 
Select [Herd],[Tag],[Byr],' + @SQL + ' 
From (
     Select [Herd],[Tag],[Byr] 
       ,B.* 
     From YourTable A 
     Cross Apply (
        Values (concat(''Mob_'',A.Date),cast(A.Mob as nvarchar(50))) 
          ,(concat('''',A.Date) ,cast(A.Value as nvarchar(50))) 
        ) B (Item,Value) 
    ) A 
Pivot (max([Value]) For [Item] in (' + Replace(@SQL,' as Mob','') + ')) p' 

Exec(@SQL); 

Возвращает

enter image description here

EDIT

Обновлено в 2014 году ... Concat() и значения

EDIT 2:

Другой вариант приведения nvarchar (50), вы можете использовать format(). Например:

   Values (concat(''Mob_'',A.Date),Format(A.Mob,''0'')) 
        ,(concat('''',A.Date) ,Format(cast(A.Value as decimal(18,2)),''#,##0.00'')) 
      ) B (Item,Value) 
+0

Так что моя таблица называется «Черта», поэтому мне нужно заменить YourTable с чертой? – proctor

+0

@proctor Yup. Это должно сделать трюк –

+0

@proctor Просто чтобы быть понятным, используете ли вы код, указанный выше? т.е. не предыдущая версия –