Sql 用Case语句结果填充变量

Sql 用Case语句结果填充变量,sql,tsql,sql-server-2008-r2,Sql,Tsql,Sql Server 2008 R2,我有一份用户填写的问卷(每天几千份) 结果是每个问卷记录包含70多个字段(对应于每个问题) 我被要求为70个问题中的每一个确定所有的定语,并将它们集中到一个字段中(记录中确定的所有问题的摘要) 在其他语言(特别是VBA)中,我会通过将变量初始化为“”、在记录集中循环并将变量设置为以前的值+问题的字段名来实现这一点。我不知道如何在sql中实现这一点 我试过 DECLARE @strFYI AS NVARCHAR SET @strFYI = '' SELECT a.record_num

我有一份用户填写的问卷(每天几千份)

结果是每个问卷记录包含70多个字段(对应于每个问题)

我被要求为70个问题中的每一个确定所有的定语,并将它们集中到一个字段中(记录中确定的所有问题的摘要)

在其他语言(特别是VBA)中,我会通过将变量初始化为“”、在记录集中循环并将变量设置为以前的值+问题的字段名来实现这一点。我不知道如何在sql中实现这一点

我试过

DECLARE @strFYI AS NVARCHAR
SET @strFYI = ''

SELECT
    a.record_num
    ,CASE
         WHEN a.Date_Missing = 'Yes' THEN @strFYI = @strFYI + 'Date_Missing, '
         WHEN a.Unclear_Images = 'Yes' THEN @strFYI = @strFYI + 'Unclear_Images, '
         WHEN a.Damage = 'Yes' THEN @strFYI = @strFYI + 'Damage, '
         ELSE @strFYI
    END AS FYI_Reasons
FROM
    questionaretable a
但很明显,这是行不通的。生成后,我还需要从列表中删除最后一个逗号和空格,但这应该不是问题。。。我只是不确定如何遍历我的记录并在tsql中构建这个连接:)我甚至不确定(因为语法错误)在计算每个记录之前是否会将变量重置为“”


有人能帮我一下吗?

对于70个专栏来说,这将是非常难看的

SELECT record_num, LEFT(strFYI, LEN(strFYI) - 2) 
FROM (
    SELECT
        a.record_num,
        (CASE WHEN a.Date_Missing = 'Yes' THEN 'Date_Missing, ' ELSE '' END) + 
        (CASE WHEN a.Unclear_Images = 'Yes' THEN 'Unclear_Images, ' ELSE  '' END) + 
        (CASE WHEN a.Damage = 'Yes' THEN 'Damage, ' ELSE '' END)  as strFYI
    FROM
        questionaretable a
     ) T
使用
IIF

IIF(布尔表达式、真值、假值)

正如CElliot在2008年未提及IIF一样,另一个解决方案可能是

isnull((select 'Date_Missing, ' where a.Date_Missing = 'Yes'),'')

可能的重复似乎是为了连接数据行,而不是数据列:(是的,这就是为什么我对youIIF()做出不同的回答的原因()是SQL Server 2012引入的。这个问题被标记为SQL Server 2008R2。@CElliott谢谢你的评论,请查看我的更新:)这个想法对我有效:)出于某种原因,不过只有LEN-1。。。出于某种原因,它似乎没有在逗号后存储额外的空格(不过这只发生在末尾,空格可以作为列表项之间的分隔符!)@JakPackage听起来很奇怪。使用select调试值是多少,例如
select'('+strFYI+')、LEN(strFYI)
以查看最终结果中的空格和大小
isnull((select 'Date_Missing, ' where a.Date_Missing = 'Yes'),'')