如何透视数据

问题描述 投票:0回答:1
PK_ID 标题2 标题3 标题 4
1 SEQ_NO 1223910 A
2 SCRAP_TYPE C A
3 SCRAP_HIST_ID 6306713 A
4 LOT_TRANS_ID 6306713 A
5 LOT_NO 231NB0012 A
6 PROC_ID CD A
7 SEQ_NO 1223911 A
8 废料类型 C A
9 SCRAP_HIST_ID 6309120 A
10 LOT_TRANS_ID 6309120 A
11 LOT_NO 231NB0013 A
12 PROC_ID CD A
... ... .... A

我需要使用上面的表数据运行数据透视表,

根据 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

enter image description here

sql sql-server t-sql pivot
1个回答
0
投票
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 执行它。

© www.soinside.com 2019 - 2024. All rights reserved.