【问题标题】:How can i use stuff function for multiple columns in SQL server?如何在 SQL Server 中对多个列使用 stuff 函数?
【发布时间】:2015-06-05 15:50:52
【问题描述】:

我需要连接具有相同 ID 的两行的两个值并为其他列取平均值。这是我的示例表:

现在我的要求是我需要连接Response 列,连接Response Rating 列并平均Rating Avg 列(如果它具有相同的ParticipantId, UseriD, QuestionId and ConductedById)。

这是我想要的目标数据:

这里Response 列和Response rating 列与各自的行连接,Rating Avg 列取平均值。我之前使用stuff 函数完成了一列连接。这可以使用 stuff 函数来实现吗?

【问题讨论】:

  • 任何时候您将多行转换为分隔字符串,您可能正在尝试在数据库中执行显示逻辑!
  • 你在使用东西的时候有没有使用“for xml path”?是的,多列也可以这样做,但可能会占用大量 CPU
  • 是的,我使用了“For xml Path”。你能帮我查询一下吗。我的记录很少,所以性能无关紧要

标签: sql sql-server sql-server-2008


【解决方案1】:

您可以执行以下操作。只需按这些列分组并为连接列进行 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”列上进行条件平均?我在“Rating Avg”中有一些 N/A 值。所以平均是不可能的。有没有一种方法可以在 N/A 值和数值上进行 N/A 和数值的组合时平均 N/A,在两个数值上进行平均时?
  • 不适用是什么意思?空值?
  • 否,值为 N/A(不适用)。
【解决方案2】:

这很好用

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'

【讨论】:

    猜你喜欢
    • 2021-09-09
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多