T-sql中的问题
我有一个名为results的表,数据如下所示:T-sql中的问题,sql,sql-server,sql-server-2005,tsql,sql-server-2008,Sql,Sql Server,Sql Server 2005,Tsql,Sql Server 2008,我有一个名为results的表,数据如下所示: Response_ID order [part label] [Answer text] [Answer label] 124587 6 It was not clear NULL Yes 124587 6 Did not Understand Null Yes 124589
Response_ID order [part label] [Answer text] [Answer label]
124587 6 It was not clear NULL Yes
124587 6 Did not Understand Null Yes
124589 6 Other (Please specify): Not enough Yes
124563 1 NULL Satisfied? Yes
124583 11 Not frequent NULL Yes
125687 2 NULL Resolved? NO
我希望输出为:
Response_ID [Part label]
124587 It was not clear,Did not Understand
124589 Not enough
124563 Yes
124583 Not frequent
125687 NO
逻辑是每当顺序为6或11时,我需要显示[Part Label],如果[Part Label]对于一个响应ID有多个值,那么我需要将它们连接起来,但当[Part Label]的值为其他值时(请指定):然后我需要使用答案文本列中的值,如果顺序不是6,11,那么我需要显示答案标签中的值。太糟糕了,没有简单的解决方案,因为Sql Server无法连接结果集行。看看这些问题:
太糟糕了,没有简单的解决方案,因为Sql Server无法连接结果集行。看看这些问题:
这过去是通过一个鲜为人知的涉及ISNULL()的角度来实现的。现在,人们用“FOR XML PATH”来实现这一点。请注意,这是不受支持的,但它将立即为您工作
这过去是通过一个鲜为人知的涉及ISNULL()的角度来实现的。现在,人们用“FOR XML PATH”来实现这一点。请注意,这是不受支持的,但它将立即为您工作 查看本文的“blackbox XML方法”部分。我相信它会满足你的需要 查看本文的“blackbox XML方法”部分。我相信它会满足你的需要
我没有看到关于订单的部分。我希望它现在能起作用
DECLARE @t TABLE (Response_ID INT,[order] INT, [part label] VARCHAR(25), [Answer text] VARCHAR(15), [Answer label] VARCHAR(3))
INSERT @t VALUES (124587,6 , 'It was not clear' , NULL , 'Yes')
INSERT @t VALUES (124587,6 , 'Did not Understand' , Null , 'Yes' )
INSERT @t VALUES (124589,6 , 'Other (Please specify):','Not enough' , 'Yes')
INSERT @t VALUES (124563,1 , NULL ,'Satisfied?' , 'Yes')
INSERT @t VALUES (124583,11, 'Not frequent' , NULL , 'Yes')
INSERT @t VALUES (125687,2 , NULL ,'Resolved?' , 'NO' )
SET ARITHABORT ON
;WITH x AS (
SELECT CASE WHEN [order] = 11 THEN 6 ELSE [order] END [order], response_id, COALESCE(CASE WHEN [part label] = 'Other (Please specify):' THEN [Answer text] ELSE [part label] end ,[Answer label]) [Part label]
FROM @t
)
SELECT response_id, STUFF((
SELECT ',' + [Part label]
FROM x t1
WHERE t1.response_id = x.response_id and t1.[order] = x.[order]
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') [Part label] FROM x
GROUP BY response_id, [order]
结果:
response_id Part label
----------- -------------------------------------
124563 Yes
124583 Not frequent
124587 It was not clear,Did not Undersstand
124589 Not enough
125687 NO
我没有看到关于订单的部分。我希望它现在能起作用
DECLARE @t TABLE (Response_ID INT,[order] INT, [part label] VARCHAR(25), [Answer text] VARCHAR(15), [Answer label] VARCHAR(3))
INSERT @t VALUES (124587,6 , 'It was not clear' , NULL , 'Yes')
INSERT @t VALUES (124587,6 , 'Did not Understand' , Null , 'Yes' )
INSERT @t VALUES (124589,6 , 'Other (Please specify):','Not enough' , 'Yes')
INSERT @t VALUES (124563,1 , NULL ,'Satisfied?' , 'Yes')
INSERT @t VALUES (124583,11, 'Not frequent' , NULL , 'Yes')
INSERT @t VALUES (125687,2 , NULL ,'Resolved?' , 'NO' )
SET ARITHABORT ON
;WITH x AS (
SELECT CASE WHEN [order] = 11 THEN 6 ELSE [order] END [order], response_id, COALESCE(CASE WHEN [part label] = 'Other (Please specify):' THEN [Answer text] ELSE [part label] end ,[Answer label]) [Part label]
FROM @t
)
SELECT response_id, STUFF((
SELECT ',' + [Part label]
FROM x t1
WHERE t1.response_id = x.response_id and t1.[order] = x.[order]
for xml path(''), type
).value('.', 'varchar(max)'), 1, 1, '') [Part label] FROM x
GROUP BY response_id, [order]
结果:
response_id Part label
----------- -------------------------------------
124563 Yes
124583 Not frequent
124587 It was not clear,Did not Undersstand
124589 Not enough
125687 NO
有什么问题吗?你想让我们帮你写代码吗?你试过什么?@JNK我确实提到过,但我写的查询不起作用。有什么问题吗?你想让我们帮你写代码吗?您尝试了什么?@JNK我确实引用了,但我编写的查询不起作用尽管我在脚本@t-clause中做了,但对上述示例数据来说效果很好,但如果一个响应ID具有不同的顺序值,则会失败我尝试调整脚本以适应不同的顺序集@t-clause,对上述示例来说效果很好数据,但如果一个响应ID具有不同的顺序值,则会失败。我尝试调整脚本以适用于不同的顺序集