Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tsql 如果在执行任务时对同一功能重复显示文本单元,如何只显示一次?_Tsql_Sql Server 2012_Distinct_String Aggregation - Fatal编程技术网

Tsql 如果在执行任务时对同一功能重复显示文本单元,如何只显示一次?

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

我在使用SQLServer2012时遇到了一个问题:我不能只显示一次文本单元,因为它在使用特性的情况下会重复显示

我需要的是,当文本单元为同一个特性重复时,就不需要重复它——只显示一次

在我的例子中,我面临的问题是,当同一个特性的文本单元是相同的时,我无法阻止重复的文本单元

电压|电压|电压仅显示一个电压

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;