我有一份问卷,我的用户已填写(每天数千张)
结果是每个问卷记录包含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中构建这个连接:)如果变量被重置为'在评估每条记录之前!
有人可以帮助我吗?
答案 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'),'')