首页 文章

数据透视表获取多个值[保留]

提问于
浏览
-2

The table defines what I have and what i would like to get.

你好

我试过转动 . 但是通过使用Max或min,我只能获得每种类型一个值 . 我想获得特定id的每种类型的所有值 .

我希望有人能帮帮忙 . 可能是枢轴不是答案 .

亲切的问候Fardeen

1 回答

  • 1

    如果您没有使用SQL Server 2017,那么您可以这样使用 .

    insert into pivottest (Id, [type], [value]) 
    values (1, 'ABC', 12), 
    (2, 'ABC', 34), 
    (1, 'ABC', 34), 
    (2, 'XYZ', 44), 
    (3, 'ABC', 1), 
    (4, 'XYZ', 33),
    (1, 'LMN', 90),
    (2, 'XYZ', 55),
    (4, 'LMN', 100),
    (4, 'LMN', 101),
    (3, 'ABC', 4),
    (3, 'ABC', 5)
    
    Begin 
    drop table #temp1 
    End 
    ;with cte as (select *, ROW_NUMBER() over (partition by [type] order by value) rownum 
    from pivottest)
    select ID, [ABC], [XYZ], [LMN] into #temp1  from cte 
    
    pivot 
    (max([value]) for [type] in ([ABC], [XYZ], [LMN])) as pvttbl 
    order by ID
    

    需要行号,以便为给定类型获取多个值 .

    select ID,  ABC, XYZ, LMN  from #temp1
    

    输出来自:

    ID  ABC      XYZ    LMN
    1   NULL    NULL    90
    3   1       NULL    NULL
    4   NULL    33      NULL
    2   NULL    44      NULL
    3   4       NULL    NULL
    4   NULL    NULL    100
    2   NULL    55      NULL
    3   5       NULL    NULL
    4   NULL    NULL    101
    1   12      NULL    NULL
    2   34      NULL    NULL
    1   34      NULL    NULL
    

    由于您的输出在同一ID的一列下显示多个值,因此您可能必须使用此值 .

    SELECT ID, 
    ABC = STUFF(
                 (SELECT ',' + cast(ABC as varchar(10)) FROM #temp1 t1 where t1.ID = t.ID  FOR XML PATH ('')), 1, 1, ''
               ),  
    XYZ = STUFF(
                 (SELECT ',' +cast(XYZ as varchar(10)) FROM #temp1 t2 where t2.ID = t.ID FOR XML PATH ('')), 1, 1, ''
               ) , 
    LMN = STUFF(
                 (SELECT ',' + cast(LMN as varchar(10)) FROM #temp1 t3 where t3.ID = t.ID FOR XML PATH ('')), 1, 1, ''
               )  
    FROM #temp1 t GROUP BY id
    

    输出:

    ID  ABC     XYZ     LMN
    1   12,34   NULL    90
    2   34     44,55    NULL
    3   1,4,5   NULL    NULL
    4   NULL    33     100,101
    

    您可以使用带有xml路径的东西进行字符串聚合 .

    你可以参考这个链接,有一个很好的解释它是如何工作的 .

    How Stuff and 'For Xml Path' work in Sql Server

    如果您使用的是SQL Server 2017,则可以使用String_Agg函数 .

    select ID, STRING_AGG(cast(ABC as varchar(10)), ',') within group (order by abc asc) 'ABC', STRING_AGG(cast(XYZ as varchar(10)), ',')  'XYZ', 
    STRING_AGG(cast(LMN as varchar(10)), ',')  'LMN' from #temp1 
    group by ID
    

    输出:

    ID   ABC   XYZ    LMN
      1 12,34   NULL    90
      2 34     55,44    NULL
      3 1,4,5   NULL    NULL
      4 NULL    33     101,100
    

    要使用多个订单,如果在类型内排序很重要,则可能必须使用多个子查询 .

相关问题