如何在SQL Server中对多列使用STUFF函数?

6
我有一个需求,需要将两行的两个值(拥有相同的ID)连接起来,并对其他列进行平均。这是我所拥有的样本表:
现在我的需求是,如果它具有相同的参与者ID、用户ID、问题ID和ConductedByID,则需要连接“Response”列,连同“Response Rating”列,并平均“Rating Avg”列。
以下是我想要的目标数据:
在此处,“Response”列和“Response rating”列将分别与各自的行连接起来,“Rating Avg”列取平均值。我之前已经使用stuff函数完成了一列连接。这可以使用stuff函数实现吗?

每当您将多行转换为分隔字符串时,您可能正在尝试在数据库中执行显示逻辑! - Jamiec
在使用stuff时,你是否使用了“for xml path”?是的,这也适用于多列,但可能会占用大量CPU资源。 - James Z
是的,我使用了"For xml Path"。你能帮我查询吗?我的记录很少,所以性能不重要。 - SqlLearner
2个回答

8
你可以这样做。只需按这些列进行分组,并为连接的列制作2个子查询:
select UserID, 
       ConductedByID, 
       QuestionID, 

       (SELECT STUFF((SELECT ';' + Response
                      FROM TableName tn2 WHERE tn1.UserID = tn2.UserID and 
                                     tn1.ConductedByID = tn2.ConductedByID and
                                     tn1.QuestionID = tn2.QuestionID and 
                                     tn1.ParticipantID = tn2.ParticipantID
            FOR XML PATH('')) ,1,1,'')) as Response,

       (SELECT STUFF((SELECT ';' + cast(Rating as varchar)
                      FROM TableName tn2 WHERE tn1.UserID = tn2.UserID and 
                                     tn1.ConductedByID = tn2.ConductedByID and
                                     tn1.QuestionID = tn2.QuestionID and 
                                     tn1.ParticipantID = tn2.ParticipantID
            FOR XML PATH('')) ,1,1,'')) as [Response Rating],

       AVG(case when Rating = 'n/a' then 0 else cast(Rating as int) end) as [Rating Avg], 
       ParticipantID
from TableName tn1
group by UserID, ConductedByID, QuestionID, ParticipantID

谢谢Giorgi,完美地解决了问题。我还有一个问题。在“Rating Avg”列上是否可以进行条件平均?我有一些值为N/A的数据。因此,无法计算平均值。是否有一种方法可以使平均值在同时包含N/A值和数字值时变为N/A,在同时包含数字值和N/A值时变为数字值,并在仅包含数字值时进行平均? - SqlLearner
"N/A" 是什么意思?空值吗? - Giorgi Nakeuri
没有数值,N/A(不适用)。 - SqlLearner

-1

这个运行得非常完美。

STUFF( 
( 
   SELECT DISTINCT ',' + val_name 
          FROM   t_t43_value_set 
             INNER JOIN     t_t43_factory 
             ON             val_id = fac_country 
             INNER JOIN     t_t43_delivery delivery 
             ON   pvs_part_version_id = del_part_version_id 
             AND  pvs_supplier_id = del_supplier_id 
             AND  del_factory_id = fac_factory_id FOR xml path('')),1,1,'') AS 'Country'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接