2014-01-30 5 views
2

Я пытаюсь понять команды PIVOT и в T-SQL на SQL Server 2012. Я полностью понимаю, что делают эти команды, но я хочу понять еще несколько деталей.Как работают PIVOT и UNPIVOT?

В настоящее время мне не хватает понимания того, почему, когда я пытаюсь использовать univot, я должен поместить исходные имена столбцов исходной таблицы для команды pivot. Сначала я создал новую таблицу и поместил там некоторые данные из другой, используя команду pivot.

USE testdb; 
IF OBJECT_ID('dbo.EmpCustOrders', 'U') IS NOT NULL 
    DROP TABLE dbo.EmpCustOrders; 

SELECT empid, A, B,C, D 
INTO dbo.EmpCustOrders 
FROM (SELECT empid, custid, qty 
    FROM dbo.Orders) AS D 
PIVOT (SUM(qty) FOR custid IN (A, B, C, D)) As newtable; 

Все в порядке. Тогда я пытаюсь использовать UNPIVOT команду для просто создать некоторый вид таблицы:

USE testdb; 
SELECT empid, custid, qty 
FROM dbo.EmpCustOrders 
UNPIVOT (qty FOR custid IN (A, B, C, D)) AS newTable; 

Результат - это все работает отлично, я могу понять, почему, когда я пишу SELECT, я должен поместить имена столбцов, custid и qty, которые являются точно так же, как и в предыдущей таблице, но не тогда, когда я пишу UNPIVOT на отдельной производной таблице. Как и где эта информация хранится в только что созданной таблице? Какую часть этого я пропущу ...

Для лучшего освещения вопроса - добавьте немного рисунка с описанной ситуацией.

enter image description here


EDIT

enter image description here

+10

Этот снимок экрана является эпическим. Хороший выбор цвета тоже. – Yuck

+1

Итак, вы не понимаете, почему вам нужно помещать имена столбцов в 'UNPIVOT' ?. Как SQL Server знает имена, которые он должен использовать ?, нет никакого способа узнать, что таблица, которую вы открываете, ранее была создана из другого 'PIVOT', поэтому он не может просто догадаться, что он должен получить имена столбцов из таблицу «Заказы» – Lamak

+0

@Lamak, но если я использую 'PIVOT' для заполнения отдельной таблицы в базе данных (значит, я заполняю пустую таблицу с информацией из другой), если тогда я хочу использовать' UNPIVOT' только что созданную таблицу (с уже добавлена ​​информация из запроса PIVOT, но с разными именами столбцов - вы можете видеть это на рис.) Я должен использовать имя столбца из таблицы, которое было похоже на источник для команды 'PIVOT'? Я прав? – gbk

ответ

1

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

USE testdb; 
SELECT empid, apples, oranges 
FROM dbo.EmpCustOrders 
UNPIVOT (oranges FOR apples IN (A, B, C, D)) AS newTable; 

Будет работать одинаково, но не имеет смысла.

Смежные вопросы