从sql行中的值中删除重复的值
我的输入代码是从sql行中的值中删除重复的值,sql,sql-server,tsql,Sql,Sql Server,Tsql,我的输入代码是 Emp_ID Scenarios 10902543 SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4 11083080 SCENARIO 3, SCENARIO 1, SCENARIO 3 10988779 SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3 而想要的产出应该是, Emp_ID Scenarios 10902543 SCEN
Emp_ID Scenarios
10902543 SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4
11083080 SCENARIO 3, SCENARIO 1, SCENARIO 3
10988779 SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3
而想要的产出应该是,
Emp_ID Scenarios
10902543 SCENARIO 3, SCENARIO 1, SCENARIO 4
11083080 SCENARIO 1, SCENARIO 3
10988779 SCENARIO 1, SCENARIO 4, SCENARIO 3
需要在不使用while循环的情况下执行此操作,请建议其他替代方法。首先使用SplitString函数,然后使用Distinct scenario值,最后使用For xml path+STUFF将它们连接起来
分裂函数
CREATE FUNCTION [dbo].[SplitString] (@Text varchar(max),@Delimiter varchar(10))
Returns Table
As
Return (
Select Pos = Row_Number() over (Order By (Select null))
,Value = LTrim(RTrim(B.i.value('(./text())[1]', 'varchar(max)')))
From (Select x = Cast('<x>'+ Replace(@Text,@Delimiter,'</x><x>')+'</x>' as xml).query('.')) as A
Cross Apply x.nodes('x') AS B(i)
);
使用XML方法的另一种方法 模式: 现在拆分场景,应用Distinct并使用逗号将它们添加到一起
;WITH CTE AS(
SELECT DISTINCT Emp_ID, SPLT.B.value('.','varchar(max)') Scenarios
FROM(
SELECT Emp_ID, Scenarios
,CAST( '<M>'+REPLACE(Scenarios,', ','</M><M>')+'</M>' AS XML) XML_DATA
FROM #TAB
)A
CROSS APPLY
A.XML_DATA.nodes('/M') AS SPLT(B)
)
SELECT DISTINCT Emp_ID
, STUFF((SELECT ','+Scenarios
FROM CTE C1
WHERE C1.Emp_ID = C2.Emp_ID FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'') as Scenarios FROM CTE C2
对首先,读一读,你会发现很多原因,为什么这个问题的答案绝对是肯定的!。第二,阅读Jeff Moden的。请共享您的sql查询。选择*从方案基础EMP_ID注释10016351方案4 10016351方案1 10016351方案4 10016351方案4 10048404方案3 10684877方案1 10048404方案1选择EMP_ID,填充选择','+注释为VARCHAR10[文本]从SCENARIOS_BASE中,EMP_ID=T.EMP_ID表示XML路径,键入.value'.',NVARCHARMAX',1,2',从SCENARIOS_BASE T GROUP中的列表输出EMP_ID刚刚开始编写一个与您非常相似的答案+1.只有一件事,stuff函数没有连接它们,那就是for-xml路径。所有的工作都是删除第一个逗号。如果使用XML,请确保&
Emp_ID Scenarios
-----------------------------------------------
10902543 SCENARIO 1, SCENARIO 3, SCENARIO 4
11083080 SCENARIO 1, SCENARIO 3
10988779 SCENARIO 1, SCENARIO 3, SCENARIO 4
CREATE TABLE #TAB(Emp_ID BIGINT, Scenarios VARCHAR(MAX))
INSERT INTO #TAB
SELECT 10902543,'SCENARIO 3, SCENARIO 1, SCENARIO 1, SCENARIO 4'
UNION ALL
SELECT 11083080,'SCENARIO 3, SCENARIO 1, SCENARIO 3'
UNION ALL
SELECT 10988779,'SCENARIO 4, SCENARIO 1, SCENARIO 4, SCENARIO 3'
;WITH CTE AS(
SELECT DISTINCT Emp_ID, SPLT.B.value('.','varchar(max)') Scenarios
FROM(
SELECT Emp_ID, Scenarios
,CAST( '<M>'+REPLACE(Scenarios,', ','</M><M>')+'</M>' AS XML) XML_DATA
FROM #TAB
)A
CROSS APPLY
A.XML_DATA.nodes('/M') AS SPLT(B)
)
SELECT DISTINCT Emp_ID
, STUFF((SELECT ','+Scenarios
FROM CTE C1
WHERE C1.Emp_ID = C2.Emp_ID FOR XML PATH(''),TYPE
).value('.','varchar(max)'),1,1,'') as Scenarios FROM CTE C2
+----------+----------------------------------+
| Emp_ID | Scenarios |
+----------+----------------------------------+
| 10902543 | SCENARIO 1,SCENARIO 3,SCENARIO 4 |
| 10988779 | SCENARIO 1,SCENARIO 3,SCENARIO 4 |
| 11083080 | SCENARIO 1,SCENARIO 3 |
+----------+----------------------------------+