如何水平查询(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。。。我需要它作为一个存储过程。然后你可以有一个现场一天的答案之一。太好了!我只是把它更新了一下。谢谢非常好的查询!伟大的我只是把它更新了一下。谢谢非常好的查询!