【发布时间】:2019-06-17 07:31:24
【问题描述】:
我需要使用 STUFF 运算符将具有相同值的行合并为一个。我归档了行连接,但值的顺序不正确。
http://www.sqlfiddle.com/#!18/2f420/1/0
正如您在结果窗口中看到的,TypeB 在 TypeA 旁边,但 Amount 值的序列与 Type 值不对应,其中 0.09K 应该在 3k 旁边
如何制作不同值的 STUFF 并保存序列(按 rn 排序)?
create table SomeTable (Code int, Type nvarchar(50), Amount nvarchar(50), Date datetime);
insert into SomeTable VALUES(20, 'TypeA', '12k', cast('01/01/2019' as datetime));
insert into SomeTable VALUES(20, 'TypeA', '11k', cast('01/01/2018' as datetime));
insert into SomeTable VALUES(22, 'TypeA', '17k', cast('01/02/2017' as datetime));
insert into SomeTable VALUES(22, 'TypeA', '17k', cast('01/01/2017' as datetime));
insert into SomeTable VALUES(25, 'TypeB', '0.09k', cast('01/02/2019' as datetime));
insert into SomeTable VALUES(25, 'TypeA', '3k', cast('01/01/2019' as datetime));
with t as (
select
row_number() over(partition by st.Code order by st.Date) as rn,
st.Code,
st.Type,
st.Amount,
st.Date
from SomeTable st
)
select
t1.Code,
stuff((select distinct ',' + t.Type from t
where t.Code = t1.Code
for XML path('')), 1,1, '') as Type,
stuff((select distinct ',' + t.Amount from t
where t.Code = t1.Code
for XML path('')), 1,1, '') as Amount,
t1.Date
from t as t1
where t1.rn = 1
order by t1.Date
【问题讨论】:
-
请出示你的sql
-
我再次看到对这种连接模式的一些误解......连接是由 SELECT...FOR XML 子查询完成的。 STUFF 只是一个字符串函数,用于从结果中删除第一个分隔符。 ;)
-
使用
DISTINCT似乎不正确。如果您有typea, 10k、typea, 11k、typeb, 11k等数据,则结果将包含typea,typeb | 10k,11k,但显然 10k 和 11k 不对应类型。 -
@Z.R.T.您确定要为此使用 STUFF,如果您正在使用 SSMS 2016+,那么您可以使用 String_agg 函数
标签: sql sql-server tsql sql-server-2008