枢纽分析表以取得多个值

时间:2018-12-09 19:55:27

标签: sql pivot

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

我尝试过旋转。但是通过使用“最大值”或“最小值”,我每种类型只能得到一个值。我想获取特定ID的每种类型的所有值。

我希望有人可以提供帮助。可能不是关键所在。

亲切的问候 Fardeen

1 个答案:

答案 0 :(得分:1)

如果您不使用SQL Server 2017,则可以这种方式使用。

<%= stylesheet_link_tag :application, "https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css", media: "all" %>

需要行号,这样您就可以为给定类型获得多个值。

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的一列下显示多个值,因此您可能必须使用此值。

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

输出:

  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 

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

您可以参考此链接,它的工作原理有很好的解释。

{{3}}

如果使用SQL Server 2017,则可以使用String_Agg函数。

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

输出:

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

要使用多个顺序,如果类型中的顺序很重要,则可能必须使用多个子查询。