回答

收藏

SQL查询未知行到列

技术问答 技术问答 233 人阅读 | 0 人回复 | 2023-09-13

我问了这个问题,它被标记为如何?SQL5 s4 V7 B# V; [' B: D* v% n5 o
Server中透视未知列数没有聚合?重复项。,但答案对我没有帮助。) P/ M8 |7 i  c3 F
我有一个看起来像这样的数据表,包括未知数量的行和值。
1 x( `% M$ L; [7 j6 O/ O9 \RecID     Name      Value1                                       Color     Red2                Size      Small3 3                                                                                                                                                                                                                                                                        Weight    20lbs4                                                                                                                                                                                                                                         Shape     Square我需要一个查询,它将返回这些数据,并为每个行建立一个列。除了列出标题的名称和值外,我不能进行任何硬编码。
( z$ j3 a% f' J$ mColor     Size     Weight     ShapeRed       Small    20lbs      Square到目前为止,这是我目前可以部分工作的内容:
! P/ L( v$ v+ k. p" y- yINSERT INTO @Table VALUES(1,'Color' ,'Red(二),Size'  ,'Small(3),Weight','20lbs(四,Shape' ,'Square') ;with mycte as (SELECT rn,cols,valFROM   (SELECT  row_number() over(order by Name) rn,Name,Value        FROM  @Table) AS src1UNPIVOT (val FOR colsIN ( [Name],[Value])) AS unpvt )SELECT *FROM   (SELECT rn,cols,val        FROM   mycte) AS src2 PIVOT( Max(val) FOR rn IN (1)AS pvt哪个返回:
" D0 j4 ^: V2 D0 _cols    1   2  33  Name    Color   Shape   SizeValue   Red Square  Small两个我似乎解决不了的问题。8 W6 h+ q1 v# ]! Y
[ol]我不需要列出标题和第一列cols,Name,Value的列。
  _3 G2 X3 v+ Y在不指定[x]在标识符的情况下,无法找出如何为每一行建立一列。[/ol]任何指导都会很棒,我坚持了一段时间。( @' e5 [& G8 g8 G' p( i
                                                                1 N1 p/ D8 b# {. n
    解决方案:                                                                  l' Y6 n$ Q& z. C% g- s! z3 o5 j
                                                                declare @collist nvarchar(max)
( G2 y+ g. c: G1 [) u                SET @collist = stuff((select distinct ‘,’   QUOTENAME(name)
( e% l4 k: [- J% v7 h$ `" @                                                                FROM #t – your table here1 l- z# h. @) s. @8 C1 T4 o2 w4 `  h
                                                                FOR XML PATH(‘’),TYPE6 g3 d& n, p) [! F! f) H
                                                                .value(‘.’,‘NVARCHAR(MAX)’)
7 `4 h$ d4 I5 N: r- P& u' ^                                                ,1,1,’‘)
! O9 X  c/ Z+ _+ N/ Ldeclare @q nvarchar(max)set @q = 'select * from  select rn,name,Value        from      select *,row_number() over (partition by name order by RecID desc) as rn        from #t -- your table here   ) as x) as sourcepivot  max(Value)    for name in ('   @collist   ) as pvt'exec (@q)
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则