SQL将单列透视到多个表?
对于SQL Server 2012: 我试图通过PIVOT将数据规范化为第一个标准格式,然后将结果保存到表中。 我需要有关轴的帮助,并将其保存到表中 原始数据是每天或每周生成的.xls,然后我将其批量插入到SQL将单列透视到多个表?,sql,sql-server,pivot,Sql,Sql Server,Pivot,对于SQL Server 2012: 我试图通过PIVOT将数据规范化为第一个标准格式,然后将结果保存到表中。 我需要有关轴的帮助,并将其保存到表中 原始数据是每天或每周生成的.xls,然后我将其批量插入到temprmi$表中 原始数据结构如下-TNUM是整个公司的唯一编号。提示文字比这三条(总共64条)多 表:temprmi$ TNUM EmpID Prompt Text TData 1 e001 fixture 506 1
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
我曾尝试使用SQLPIVOT
将其放入一个表中,然后我可以将其拆分为多个表(定义如下),但我没有成功
我想要的是:
夹具表:
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 (@DynamicPivotQuery+@DynamicPivotQuery2)
set @DynamicPivotQuery3=@DynamicPivotQuery+@DynamicPivotQuery2
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
您的输出看起来很好。您只需要确保在执行插入时只选择值不为null的行 固定装置
INSERT INTO Fixture
SELECT *
FROM PVTTable
WHERE FIXTURE IS NOT NULL
编辑
我发现您在某些记录中缺少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
使用查找表保存tablename/column/prompt组合,并使用光标进行迭代,生成一条动态语句,将相关行插入到每个表中:
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
查看以查看查找表的更多详细信息这是一次性迁移任务吗?否-原始数据以.xls的形式每天/每周提供,我将其批量插入temprmi$表。更新了上述问题以使其更清晰。64个表是否已修复?无论您如何操作,都需要单独的
insert
语句,这样可能会更简单将列表放在一个helper表中,然后围绕该表构建一个简单的动态插入查询是的,64个表是固定的(或者可以合理组合)。我没有遵循“在helper表中创建一个列表,然后围绕该表构建一个动态插入查询”的原则。您能解释更多或给出一个示例吗?