代码之家  ›  专栏  ›  技术社区  ›  Wayne Hollier

取消Pivot SQL或交叉应用表,行数据作为列标题,行数据为列数据

  •  1
  • Wayne Hollier  · 技术社区  · 7 年前

    我知道这个问题已经被问过很多次了,但我还没有找到一个解决方案与我的数据结构。然而,我确实看到了下面的文章 An Alternative (Better?) Method to UNPIVOT (SQL Spackle) .

    我有下表,原始数据结果如下

        RowType | LocalDate | UTCDate | Target1 | Target2 | Target3
        KPIName     NULL        NULL     Feed1     Feed2     Feed3
        Balance     NULL        NULL    Product   Reagent    Water
        UoM         NULL        NULL       t        t          %
        ActiveDate 2017-01-01 2016-12-31   5.0     3.2        20
    

    KPIName | Balance | ActiveDate | UTCDate  | UoM | Value
     Feed1    Product   2017-01-01  2016-12-31  t     5.0
     Feed2    Reagent   2017-01-01  2016-12-31  t     3.2
     Feed3    Water     2017-01-01  2016-12-31  %     20
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Chanukya Gordon Linoff    7 年前
    CREATE TABLE #Table1
        ([RowType] varchar(10), [LocalDate] varchar(10), [UTCDate] varchar(10), [Target1] varchar(7), [Target2] varchar(7), [Target3] varchar(5))
    ;
    
    INSERT INTO #Table1
        ([RowType], [LocalDate], [UTCDate], [Target1], [Target2], [Target3])
    VALUES
        ('KPIName', NULL, NULL, 'Feed1', 'Feed2', 'Feed3'),
        ('Balance', NULL, NULL, 'Product', 'Reagent', 'Water'),
        ('UoM', NULL, NULL, 't', 't', '%'),
        ('ActiveDate', '2017-01-01', '2016-12-31', '5.0', '3.2', '20')
    ;
     SELECT 
    X.KPINAME,X.BALANCE,LOCALDATE,UTCDATE,X.UOM,X.VALUE
    FROM #TABLE1
     CROSS APPLY (
        VALUES ('FEED1', 'PRODUCT','T',5.0)
        ,('FEED2', 'REAGENT','T',3.2)
        ,('FEED3', 'WATER','%',20)) X(KPINAME, BALANCE,UOM,VALUE)
        WHERE LOCALDATE IS NOT NULL