我有以下查询:
SELECT CASE WHEN [Question Order] IN ( 6, 11 )
THEN CASE WHEN [Question Part Label] = 'Other (Please specify):'
THEN [Answer Text]
ELSE [Question Part Label]
END
ELSE 'replace code here'
END,[Respondent ID]
FROM Results
WHERE [Question Order] IN ( 6, 11 ) AND [Answer Label] = 'Yes'
现在我想替换这里代码'替换代码'
select
stuff((select ','+T2.[Question Part Label] from Results as T2
where T1.[Respondent ID] = T2.[Respondent ID] for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '')
as Label from Results as T1 group by T1.[Respondent ID]
当我这样做时,我收到以下错误
Msg 512, Level 16, State 1, Line 1
Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <= , >, >= or when the subquery is used as an expression.
示例数据:
Respondent ID [Question Order] [Question Part Label] [Answer Text] [Answer Label]
124587 6 It was not clear NULL Yes
124587 6 Did not Undersstand NULL Yes
124589 6 Other (Please specify): Not enough Yes
125654 6 Too Fast NULL Yes
124582 11 Not frequent NULL Yes
输出Shpuld是:
Respondent ID [Question Part Label]
124587 It was not clear,Did not Undersstand
124589 Not Enough
125654 Too Fast
124582 Not frequent
逻辑是每当问题顺序是6或11然后我需要显示[问题部分标签]如果[问题部分标签]有一个Respondent_ID的多个值然后我需要连接它们但是当[问题的值]时Part Label]是Other(请注明):然后我需要使用Answer Text列中的值 一个
我该如何解决这个问题?
答案 0 :(得分:1)
将其添加到“在此处替换代码”
stuff((select ','+T2.[Question Part Label]
from Results as T2
where T1.[Respondent ID] = T2.[Respondent ID]
for xml path(''), type).value('.', 'varchar(max)'), 1, 1, '')
将T1添加为主查询中result
表的别名。
答案 1 :(得分:1)
DECLARE @Results TABLE
(
Respondent_ID INT,
[Question Order] INT,
[Question Part Label] VARCHAR(40),
[Answer text] VARCHAR(80),
[Answer Label] VARCHAR(10)
);
INSERT @Results
SELECT 124587, 6, 'It was not clear', NULL, 'Yes'
UNION SELECT 124587, 6, 'Did not Undersstand', NULL, 'Yes'
UNION SELECT 124589, 6, 'Other (Please specify):', 'Not enough', 'Yes'
UNION SELECT 124654, 6, 'Too Fast', NULL, 'Yes'
UNION SELECT 124582, 11, 'Not frequent', NULL, 'Yes';
WITH x AS
(
SELECT Respondent_ID
FROM @Results
WHERE [Question Order] IN (6,11)
GROUP BY Respondent_ID
)
SELECT x.Respondent_ID, Label = STUFF((SELECT ',' + CASE
WHEN [Question Part Label] = 'Other (Please specify):' THEN [Answer text]
ELSE [Question Part Label] END
FROM @Results
WHERE [Question Order] IN (6,11)
AND Respondent_ID = x.Respondent_ID
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)'), 1, 1, '')
FROM x;
答案 2 :(得分:0)
我不在使用SQL Server的计算机上,因此我无法对此进行测试(我确信您可以找到更有效的方法),但您可以尝试以下方法:
;WITH CTE AS
(
SELECT T1.[Respondent ID],
stuff(( SELECT ','+T2.[Question Part Label]
FROM Results as T2
WHERE T1.[Respondent ID] = T2.[Respondent ID]
FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 1, 1, '') as Label
FROM Results as T1
GROUP BY T1.[Respondent ID]
)
SELECT CASE WHEN [Question Order] IN ( 6, 11 )
THEN CASE WHEN [Question Part Label] = 'Other (Please specify):'
THEN [Answer Text]
ELSE [Question Part Label]
END
ELSE R2.Label
END, R1.[Respondent ID]
FROM Results R1
LEFT JOIN CTE R2
ON R1.[Respondent ID] = R2.[Respondent ID]
WHERE [Question Order] = 6 AND [Answer Label] = 'Yes'