如何水平查询(T-SQL)一列?

如何水平查询(T-SQL)一列?,sql,sql-server,tsql,sql-server-2016,Sql,Sql Server,Tsql,Sql Server 2016,我有这张桌子: select A.field1, a.field2, a.field3, a.store from ( select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's1' as store union all select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's2' as store union all select 'g1' as field1, 'g2' as f

我有这张桌子:

select A.field1, a.field2, a.field3, a.store
from (
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's1' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's2' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's3' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store
) A
输出是下一个:

field1  field2  field3  store
g1      g2      g3      s1
g1      g2      g3      s2
g1      g2      g3      s3
g1      g2      g3      s4
g1      g2      g3      s4
field1  field2  field3  store
g1      g2      g3      s1_s2_s3_s4
我想要下一个:

field1  field2  field3  store
g1      g2      g3      s1
g1      g2      g3      s2
g1      g2      g3      s3
g1      g2      g3      s4
g1      g2      g3      s4
field1  field2  field3  store
g1      g2      g3      s1_s2_s3_s4
这可能吗

谢谢

给你:

;with A as(
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's1' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's2' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's3' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store
)
select * from 
(select distinct field1,field2,field3 from A) Af
cross apply(select
                STUFF(  ( 
                        select distinct '_' + A.store
                        from ( select * from A) A
                        where Af.field1=A.field1 and Af.field2=A.field2 and Af.field3=A.field3 
                        FOR XML PATH(''), TYPE
                    ).value('.','nvarchar(max)')
                ,1,1, '') as conc_store
            ) as q1
Af是字段的所有可能值, A将存储值连接起来

请注意,如果A实际上以表的形式存在,则不需要带有as…部分的

给您:

;with A as(
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's1' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's2' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's3' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store union all
select 'g1' as field1, 'g2' as field2, 'g3' as field3, 's4' as store
)
select * from 
(select distinct field1,field2,field3 from A) Af
cross apply(select
                STUFF(  ( 
                        select distinct '_' + A.store
                        from ( select * from A) A
                        where Af.field1=A.field1 and Af.field2=A.field2 and Af.field3=A.field3 
                        FOR XML PATH(''), TYPE
                    ).value('.','nvarchar(max)')
                ,1,1, '') as conc_store
            ) as q1
Af是字段的所有可能值, A将存储值连接起来


请注意,如果A实际上以表的形式存在,您将不需要带有as…
部分的

升级到2017年,享受
STRING\u AGG
的好处。此代码非常不方便。你真的是手工插入行吗?没有现成的桌子吗?是否已经存在?我的客户不想升级到2017。。。我需要它来做一个存储过程。然后你就可以在一天内得到一个答案。升级到2017年,享受
STRING\u AGG
的好处。这段代码真的很不方便。你真的是手工插入行吗?没有现成的桌子吗?是否已经存在?我的客户不想升级到2017。。。我需要它作为一个存储过程。然后你可以有一个现场一天的答案之一。太好了!我只是把它更新了一下。谢谢非常好的查询!伟大的我只是把它更新了一下。谢谢非常好的查询!