我需要使用上面的表数据运行数据透视表,
根据 HEADER2 的规律性,我想将 HEADER2 转为列,将 HEADER3 转为 ROW,但我不知道如何设置条件并旋转转轴。
不同的标头动态传入,数据传入如上表,那么我该怎么办
结果是使用 switch case 语法导出的,但导出了一个标头和数据。
DECLARE @SN INT
DECLARE @ST INT
DECLARE @SH INT
DECLARE @LTI INT
DECLARE @LT INT
DECLARE @PI INT
SET @SN = 0
SET @ST = 0
SET @SH = 0
SET @LTI = 0
SET @LT = 0
SET @PI = 0
SELECT TOP 10000 MIN(SEQ_NO) AS 'SEQ_NO', MIN(SCRAP_TYPE) AS 'SCRAP_TYPE', MIN(SCRAP_HIST_ID) AS 'SCRAP_HIST_ID' , MIN(LOT_TRANS_ID) AS 'LOT_TRANS_ID' , MIN(LOT_NO) AS 'LOT_NO', MIN(PROC_ID) AS 'PROC_ID'
FROM ( SELECT CASE WHEN HEADER2 ='SEQ_NO' THEN 'SEQ_NO' END AS SEQ_NO
, CASE WHEN HEADER2 ='SCRAP_TYPE' THEN 'SEQ_NO' END AS SCRAP_TYPE
, CASE WHEN HEADER2 ='SCRAP_HIST_ID' THEN 'SEQ_NO' END AS SCRAP_HIST_ID
, CASE WHEN HEADER2 ='LOT_TRANS_ID' THEN 'SEQ_NO' END AS LOT_TRANS_ID
, CASE WHEN HEADER2 ='LOT_NO' THEN 'SEQ_NO' END AS LOT_NO
, CASE WHEN HEADER2 ='PROC_ID' THEN 'SEQ_NO' END AS PROC_ID
, CASE WHEN HEADER2 = 'SEQ_NO' THEN @SN +1
WHEN HEADER2 = 'SCRAP_TYPE' THEN @ST+1
WHEN HEADER2 = 'SCRAP_HIST_ID' THEN @SH + 1
WHEN HEADER2 = 'LOT_TRANS_ID' THEN @LTI + 1
WHEN HEADER2 = 'LOT_NO' THEN @LT + 1
WHEN HEADER2 = 'PROC_ID' THEN @PI + 1 END AS ROWNUMBER
FROM #temptable
UNION ALL
SELECT CASE WHEN HEADER2 ='SEQ_NO' THEN HEADER3 END AS SEQ_NO
, CASE WHEN HEADER2 ='SCRAP_TYPE' THEN HEADER3 END AS SCRAP_TYPE
, CASE WHEN HEADER2 ='SCRAP_HIST_ID' THEN HEADER3 END AS SCRAP_HIST_ID
, CASE WHEN HEADER2 ='LOT_TRANS_ID' THEN HEADER3 END AS LOT_TRANS_ID
, CASE WHEN HEADER2 ='LOT_NO' THEN HEADER3 END AS LOT_NO
, CASE WHEN HEADER2 ='PROC_ID' THEN HEADER3 END AS PROC_ID
, CASE WHEN HEADER2 = 'SEQ_NO' THEN @SN+1
WHEN HEADER2 = 'SCRAP_TYPE' THEN @ST+1
WHEN HEADER2 = 'SCRAP_HIST_ID' THEN @SH + 1
WHEN HEADER2 = 'LOT_TRANS_ID' THEN @LTI + 1
WHEN HEADER2 = 'LOT_NO' THEN @LT + 1
WHEN HEADER2 = 'PROC_ID' THEN @PI + 1 END AS ROWNUMBER
FROM #temptable
) SUB
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
SELECT @columns = STRING_AGG(QUOTENAME(HEADER2), ', ') WITHIN GROUP (ORDER BY HEADER2 DESC)
FROM (SELECT DISTINCT HEADER2 FROM #temptable) AS Headers;
SET @sql = '
SELECT ' + @columns + '
FROM (
SELECT HEADER2, HEADER3 FROM #temptable
) AS Source
PIVOT (
MIN(HEADER3) FOR HEADER2 IN (' + @columns + ')
) AS PivotTable;';
EXEC sp_executesql @sql;
上述查询动态识别
HEADER2
表的 #temptable
列中的唯一标头,并使用这些标头构造 PIVOT
查询,并通过动态 SQL 执行它。