Tsql 如果在执行任务时对同一功能重复显示文本单元,如何只显示一次?
我在使用SQLServer2012时遇到了一个问题:我不能只显示一次文本单元,因为它在使用特性的情况下会重复显示 我需要的是,当文本单元为同一个特性重复时,就不需要重复它——只显示一次 在我的例子中,我面临的问题是,当同一个特性的文本单元是相同的时,我无法阻止重复的文本单元 电压|电压|电压仅显示一个电压Tsql 如果在执行任务时对同一功能重复显示文本单元,如何只显示一次?,tsql,sql-server-2012,distinct,string-aggregation,Tsql,Sql Server 2012,Distinct,String Aggregation,我在使用SQLServer2012时遇到了一个问题:我不能只显示一次文本单元,因为它在使用特性的情况下会重复显示 我需要的是,当文本单元为同一个特性重复时,就不需要重复它——只显示一次 在我的例子中,我面临的问题是,当同一个特性的文本单元是相同的时,我无法阻止重复的文本单元 电压|电压|电压仅显示一个电压 CREATE TABLE #FinalTable ( PartID INT, DKFeatureName NVARCHAR(100), TextUnit NVARCHA
CREATE TABLE #FinalTable
(
PartID INT,
DKFeatureName NVARCHAR(100),
TextUnit NVARCHAR(100),
StatusId INT
)
INSERT INTO #FinalTable (PartID, DKFeatureName, TextUnit, StatusId)
VALUES
(1211, 'PowerSupply', 'Voltage', 3),
(1211, 'PowerSupply', 'Voltage', 3),
(1211, 'PowerSupply', 'Voltage', 3)
SELECT
PartID, DKFeatureName,
COUNT(PartID) AS CountParts,
TextUnit = STUFF ((SELECT ' | ' + TextUnit
FROM #FinalTable b
WHERE b.PartID = a.PartID
AND a.DKFeatureName = b.DKFeatureName
AND StatusId = 3
FOR XML PATH('')), 1, 2, ' ')
INTO
#getUnitsSticky
FROM
#FinalTable a
GROUP BY
PartID, DKFeatureName
HAVING
(COUNT(PartID) > 1)
SELECT *
FROM #getUnitsSticky
预期结果是:
Voltage
不正确的结果或我不需要的结果如下:
Voltage|Voltage|Voltage
要将这一点转化为一个完整的答案-这应该是您的SQL(稍微缩短并删除最后一个临时表):
要将这一点转化为一个完整的答案-这应该是您的SQL(稍微缩短并删除最后一个临时表):
TomC的答案基本上是正确的。但是,在SQL Server中使用此方法时,通常更有效的方法是获取子查询中的行,然后在外部查询中使用
stuff()
。这样,每行中的值只处理一次
因此:
这也会从连接的结果中删除前导空格。TomC的答案基本正确。但是,在SQL Server中使用此方法时,通常更有效的方法是获取子查询中的行,然后在外部查询中使用
stuff()
。这样,每行中的值只处理一次
因此:
这也会从连接的结果中删除前导空格。您是否尝试将select distinct添加到查询中?是的,我尝试过,但仍然重复了select distinct PartID、DKFeatureName…这是错误的pl;王牌尝试
STUFF((选择distinct'|'+TextUnit
太好了。我也添加了一个答案,所以如果正确请勾选它。您是否尝试将SELECT distinct添加到您的查询中?是的,我尝试过,但在选择distinct PartID,DKFeatureName…时仍然重复。这是错误的pl;ace。尝试STUFF((选择不同的“|”+TextUnit
Great。我也添加了答案,因此如果正确,请勾选它。
SELECT
PartID, DKFeatureName,
COUNT(PartID) AS CountParts,
TextUnit = STUFF ((SELECT distinct ' | ' + TextUnit
FROM #FinalTable b
WHERE b.PartID = a.PartID
AND a.DKFeatureName = b.DKFeatureName
AND StatusId = 3
FOR XML PATH('')), 1, 2, ' ')
FROM #FinalTable a
GROUP BY PartID, DKFeatureName
HAVING (COUNT(PartID) > 1)
SELECT PartID, DKFeatureName, CountParts,
STUFF( (SELECT ' | ' + TextUnit
FROM #FinalTable b
WHERE b.PartID = a.PartID AND
b.DKFeatureName = a.DKFeatureName AND
StatusId = 3
FOR XML PATH('')
), 1, 3, ' ') as TextUnit
INTO #getUnitsSticky
FROM (SELECT PartID, DKFeatureName, COUNT(*) as CountParts
FROM #FinalTable a
GROUP BY PartID, DKFeatureName
HAVING COUNT(*) > 1
) a;