Как развернуть эту таблицу

Я создал временную таблицу, которую хочу развернуть, но постоянно получаю следующее сообщение об ошибке: Сообщение 156, уровень 15, состояние 1, строка 196. Неверный синтаксис рядом с ключевым словом for. >

Моя временная таблица ниже:

Номер заказа досье T_Code Routine_Labour Variable_Labour

введите здесь описание изображения

Я хотел бы развернуть его ниже:

введите здесь описание изображения

Я использовал скрипт ниже:

Select 
Dossier,
Order_Number,
T_Code,
Labour_Type,
Amount

from 
#LabourSplit

Unpivot 
(
 Amount for Labour_Type in (Routine_Labour, Variable_Labour)
 ) as LabourSplit_U

Как только я запускаю этот скрипт, появляется сообщение об ошибке. даже я закомментировал два столбца во временной таблице и в сценарии, сообщение об ошибке все еще там.

Select 
Dossier,
--Order_Number,
--T_Code,
Labour_Type,
Amount

from 
#LabourSplit

Unpivot 
(
 Amount for Labour_Type in (Routine_Labour, Variable_Labour)
 ) as LabourSplit_U

person user3268139    schedule 30.06.2014    source источник
comment
Вы можете просто скопировать и вставить эти строки вместо того, чтобы помещать их в изображения?   -  person Erran Morad    schedule 30.06.2014
comment
Какую версию SQL Server вы используете? И каков уровень совместимости базы данных, к которой вы подключаетесь?   -  person Martin Smith    schedule 30.06.2014
comment
@MartinSmith Это SQL Server 2012. Не уверен насчет уровня совместимости базы данных. Я думаю, что это может быть связано с версией. Потому что даже я запускаю онлайн-пример, появляется та же ошибка. ingenioussql.com/2013/05/09/standard-t -sql-развернуть   -  person user3268139    schedule 01.07.2014


Ответы (2)


Попробуй это:

Select 
Dossier,
Order_Number,
T_Code,
Labour_Type,
Amount
FROM
(
  Select 
  Dossier,
  Order_Number,
  T_Code,
  Routine_Labour, 
  Variable_Labour
  from #LabourSplit
) a
Unpivot 
(
  Amount for Labour_Type in (Routine_Labour, Variable_Labour)
) as LabourSplit_U

скрипт SQL

Полученные результаты:

| DOSSIER | ORDER_NUMBER | T_CODE |     LABOUR_TYPE | AMOUNT |
|---------|--------------|--------|-----------------|--------|
|    1234 |         5678 |      1 |  Routine_Labour |     10 |
|    1234 |         5678 |      1 | Variable_Labour |     20 |
|    1234 |         3434 |      1 |  Routine_Labour |     20 |
|    1234 |         3434 |      1 | Variable_Labour |     70 |
|    1234 |         5671 |      1 |  Routine_Labour |     30 |
|    1234 |         5671 |      1 | Variable_Labour |     10 |
|    1234 |         3422 |      1 |  Routine_Labour |     40 |
|    1234 |         3422 |      1 | Variable_Labour |     40 |
|    1234 |         1122 |      1 |  Routine_Labour |     11 |
|    1234 |         1122 |      1 | Variable_Labour |     30 |

Однако, насколько мне известно, UNPIVOT поддерживается в полных версиях SQL Server. Если у вас есть компактная версия или другие бесплатные версии, вам нужно использовать UNION ALL:

Select 
Dossier,
Order_Number,
T_Code,
'Routine_Labour' AS Labour_Type,
Routine_Labour AS Amount
FROM LabourSplit
UNION ALL 
Select 
Dossier,
Order_Number,
T_Code,
'Variable_Labour' AS Labour_Type,
Variable_Labour AS Amount
FROM LabourSplit
ORDER BY 1,2,3

Проверьте эту скрипт SQL.

Полученные результаты:

| DOSSIER | ORDER_NUMBER | T_CODE |     LABOUR_TYPE | AMOUNT |
|---------|--------------|--------|-----------------|--------|
|    1234 |         1122 |      1 |  Routine_Labour |     11 |
|    1234 |         1122 |      1 | Variable_Labour |     30 |
|    1234 |         3422 |      1 | Variable_Labour |     40 |
|    1234 |         3422 |      1 |  Routine_Labour |     40 |
|    1234 |         3434 |      1 |  Routine_Labour |     20 |
|    1234 |         3434 |      1 | Variable_Labour |     70 |
|    1234 |         5671 |      1 | Variable_Labour |     10 |
|    1234 |         5671 |      1 |  Routine_Labour |     30 |
|    1234 |         5678 |      1 |  Routine_Labour |     10 |
|    1234 |         5678 |      1 | Variable_Labour |     20 |
person cha    schedule 30.06.2014
comment
Либо это не SQL Server 2008, либо ваш тип данных для Routine_Labour и Variable_Labour отличается. Проверьте скрипт: sqlfiddle.com/#!3/294e4/1 - person cha; 01.07.2014
comment
Большое спасибо. У меня SQL Server 2012. Что мне делать с версией 2012? - person user3268139; 01.07.2014
comment
Вот скрипка для SQL Server 2012. Там тоже работает. sqlfiddle.com/#!6/294e4/1 - person cha; 01.07.2014
comment
Если только ваш SQL Server не является компактной версией или какой-либо другой версией полной версии. - person cha; 01.07.2014
comment
оставайтесь со мной, я дам вам другое решение, которое будет работать там - person cha; 01.07.2014

Я думаю, что CROSS APPLY VALUES проще в использовании и понимании, чем UNPIVOT.

SELECT Dossier
      ,Order_Number
      ,T_Code
      ,Labour_Type
      ,Amount
FROM #LabourSplit
     CROSS APLLY (
         VALUES (Routine_Labour, 'Routine_Labour')
               ,(Variable_Labour, 'Variable_Labour')
     ) AS CA1(Amount, Labour_Type)
person adrianm    schedule 30.06.2014