代码之家  ›  专栏  ›  技术社区  ›  Sei Jon

一个Pivot查询中的两个操作

  •  0
  • Sei Jon  · 技术社区  · 4 年前

    我有一个选择查询的数据,如下所示:

    ScopeGroupID             Activity                Col1         Col2               Col3
    421471                   Release to Trace        001-20-01    19072M-001-01      19101
    421471                   Trace Complete          001-20-02    19072M-001-02      19102
    421471                   NDE Complete            001-20-03    19072M-001-03      19103
    421473                   Release to Trace        001-20-04    19072M-001-04      19104
    421473                   Trace Complete          001-20-05    19072M-001-05      19105
    421473                   NDE Complete            001-20-06    19072M-001-06      19106
    

    我试图在一个查询中实现两件事,因为这将是一个动态的查询。

    一:获取活动作为列标题和 第二:将列Col1、Col2和Col3设置为行值。在步骤1中创建的每个列标题下,这些相应的值应显示如下:

    ScopeGroupID       Selected Params      Release to Trace     Trace Complete       NDE Complete
    421471             Col1                 001-20-01            001-20-02            001-20-03
    421471             Col2                 19072M-001-01        19072M-001-02        19072M-001-03
    421471             Col3                 19101                19102                19103
    421473             Col1                 001-20-04            001-20-05            001-20-06
    421473             Col2                 19072M-001-04        19072M-001-05        19072M-001-06
    421473             Col3                 19104                19105                19106
    

    活动是动态的,数量可以很多。

    任何帮助都将不胜感激。 以下是用于测试的SQL插入:

    declare @datatemp table(ScopeGroupID int, Activity varchar(50),
    Col1 varchar(50), Col2 varchar(50), Col3 int)
    
    insert into @datatemp
    select 421471, 'Release to Trace', '001-20-01', '19072M-001-01', 19101
    union
    select 421471, 'Trace Complete', '001-20-02', '19072M-001-02', 19102
    union
    select 421471, 'NDE Complete', '001-20-03', '19072M-001-03', 19103
    union
    select 421473, 'Release to Trace', '001-20-04', '19072M-001-04', 19104
    union
    select 421473, 'Trace Complete', '001-20-05', '19072M-001-05', 19105
    union
    select 421473, 'NDE Complete', '001-20-06', '19072M-001-06', 19106
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   gotqn user3521065    4 年前

    你首先需要表演 UNPIVOT 那么 PIVOT :

    SELECT ScopeGroupID
          ,[column]
          ,[Release to Trace]
          ,[Trace Complete]
          ,[NDE Complete]
    FROM
    (
        SELECT ScopeGroupID
              ,Activity
              ,Col1
              ,Col2
              ,CAST(Col3 AS VARCHAR(50)) AS Col3
        FROM @datatemp
    ) DS
    UNPIVOT
    (
        [value] FOR [column] IN ([Col1], [Col2], [Col3])
    ) UNPVT
    PIVOT
    (
        MAX([value]) FOR [Activity] IN ([NDE Complete], [Release to Trace], [Trace Complete])
    ) PVT
    ORDER BY ScopeGroupID
            ,[column];
    

    enter image description here

    推荐文章