使用案例陈述结果填充变量

时间:2015-10-30 21:04:54

标签: sql tsql sql-server-2008-r2

我有一份问卷,我的用户已填写(每天数千张)

结果是每个问卷记录包含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中构建这个连接:)如果变量被重置为'在评估每条记录之前!

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

This will be very ugly for 70 columns.

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

Maybe is cleaner using IIF

IIF ( boolean_expression, true_value, false_value )

SELECT record_num, LEFT(strFYI, LEN(strFYI) - 2) 
FROM (
    SELECT
        a.record_num,
        IIF(a.Date_Missing = 'Yes', 'Date_Missing, ' , '' ) + 
        IIF(a.Unclear_Images = 'Yes', 'Unclear_Images, ',  '') + 
        IIF(a.Damage = 'Yes', 'Damage, ', '')  as strFYI
    FROM
        questionaretable a
     ) T

As CElliot mention not IIF in 2008 so another solution may be

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