SQL将单列透视到多个表?

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

对于SQL Server 2012:

我试图通过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 (@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表中创建一个列表,然后围绕该表构建一个动态插入查询”的原则。您能解释更多或给出一个示例吗?