2015-06-23 3 views
0

Для SQL Server 2012:SQL Pivot для одного столбца для нескольких таблиц?

Я пытаюсь нормализовать свои данные в первую нормальную форму через PIVOT, а затем сохранить результаты в таблицу. Мне нужна помощь на PIVOT и сохранение ее на столе.

Исходные данные - это ежедневная или еженедельная генерация .xls, затем я вставляю ее в таблицу temprmi$.

Структура необработанных данных ниже - TNUM - уникальный номер для всей компании. Есть более быстрые тексты, чем только эти три (всего 64).

Таблица: temprmi$

TNUM EmpID Prompt Text  TData 
1  e001  fixture   506 
1  e011  sheet   F1234567 
1  f001  cweld   abcDFG 
2  f031  fixture   510 
2  f032  sheet   H7654321 
2  e001  cweld   DFGabc 

Я пытался использовать SQL PIVOT, чтобы получить его в одну таблицу, которая потом может вспыхнуть на несколько (как определено ниже), но я не быть успешным.

То, что я хотел бы получить его, чтобы быть:

Крепеж Таблица:

TNUM  Fixture EMPID 
1  506  e001 
2  510  f031 

лист таблице:

TNUM  Sheet EMPID 
1  F1234567 e011 
2  H7654321 f032 

Любая помощь будет оценена.

Я добавил свой запрос PIVOT для справки, но он не работает. (Выход ниже, а

DECLARE @ColumnName AS NVARCHAR(MAX) 
DECLARE @DynamicPivotQuery AS nvarchar(max) 
DECLARE @DynamicPivotQuery2 AS nvarchar(max) 
DECLARE @DynamicPivotQuery3 AS nvarchar(max) 
--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
+ QUOTENAME([prompt text]) 
FROM (SELECT DISTINCT [prompt text] FROM temprmi$) AS Prompts 
--select @ColumnName 
SET @DynamicPivotQuery ='SELECT [trav num],[empid],' + @ColumnName 
SET @DynamicPivotQuery2=' FROM [temprmi$] 
PIVOT(min([TData]) 
    FOR [Prompt Text] IN (' + @ColumnName + ')) AS PVTTable' 
--select (@[email protected]) 
set @[email protected][email protected] 
EXEC sp_executesql @DynamicPivotQuery3 
select @DynamicPivotQuery3 

Выход:...

TNUM EmpID Fixture   sheet 
1  null  506    null 
1  e001  null   null 
1  null  null   F1234567 
2  null  510    null 
2  e001  null   null 
2  null  null   H7654321 
+1

Это одноразовая задача миграции? – Amit

+0

Нет - Сырые данные поступают ежедневно/еженедельно, так как объем .xls и I вставляет его в таблицу temprmi $. Обновлен вопрос выше, чтобы быть более четким. – TangoAlee

+0

Исправлены ли 64 таблицы?Вам нужны отдельные инструкции 'INSERT', независимо от того, как вы это делаете, может быть проще иметь список в вспомогательной таблице, а затем построить простой динамический запрос вставки вокруг этого – Amit

ответ

1

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

для светильников

INSERT INTO Fixture 
SELECT * 
FROM PVTTable 
WHERE FIXTURE IS NOT NULL 

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

CREATE TABLE #temprmi (
    TNUM INT, 
    EmpID VARCHAR(50), 
    [Prompt Text] VARCHAR(100), 
    TData VARCHAR(100)) 

INSERT INTO #temprmi 
     (TNUM,EmpID,[Prompt Text],TData) 
VALUES 
(1,'e001','fixture','506'), 
(1,'e011','sheet','F1234567'), 
(1,'f001','cweld','abcDFG'), 
(2,'f031v','fixture','510'), 
(2,'f032','sheet','H7654321'), 
(2,'e001','cweld','DFGabc') 


DECLARE @columns VARCHAR(MAX) 
SELECT @columns = COALESCE(@columns + ',', '') + CONCAT('[', [Prompt Text], ']') 
FROM ( SELECT DISTINCT [Prompt Text] 
     FROM #temprmi) AS t 

DECLARE @sql VARCHAR(MAX) = 
' 
    SELECT TNUM, EmpID, ' + @columns + ' 
    FROM #temprmi 
    PIVOT (
     MIN(Tdata) 
     FOR [Prompt Text] IN (' + @columns + ') 
    ) p 
' 
EXEC(@sql) 

DROP TABLE #temprmi 
1

Используйте таблицу поиска, чтобы держать TABLENAME/колонки/незамедлительные комбинации, и перебирать, что с помощью курсора, создавая динамический оператор для вставки соответствующих строк в каждой таблице:

DECLARE @tableName varchar(20), 
     @columnName varchar(20), 
     @prompt varchar(20) 

DECLARE @dynSQL varchar(500) 

DECLARE cLookup CURSOR FOR 
    SELECT * FROM Lookup 

OPEN cLookup 
FETCH NEXT FROM cLookup 
INTO @tableName, @columnName, @prompt 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @dynSQL = 'INSERT INTO ' + @tableName + 
    ' SELECT TNUM, EMPID, TData AS ' + @columnName + 
    ' FROM Input WHERE [Prompt Text] = ''' + @prompt + '''' 

    EXEC sp_executesql @dynSQL 

    FETCH NEXT FROM cLookup 
    INTO @tableName, @columnName, @prompt 
END 

CLOSE cLookup 
DEALLOCATE cLookup 

Посмотрите на this SQLFiddle, чтобы увидеть более подробную информацию о таблице поиска

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