The table defines what I have and what i would like to get.
嗨
我尝试过旋转。但是通过使用“最大值”或“最小值”,我每种类型只能得到一个值。我想获取特定ID的每种类型的所有值。
我希望有人可以提供帮助。可能不是关键所在。
亲切的问候 Fardeen
答案 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
要使用多个顺序,如果类型中的顺序很重要,则可能必须使用多个子查询。