我正在更新一个网站,这个网站本质上是一个竞赛,每个参赛者都由(n)个评委投票决定,每个评委都会留下反馈信息,这些反馈信息存储在“反馈”栏的表格“recEntrantStatus”中。
我需要能够收集所有反馈给一个给定的进入者,并整理这些数据,然后将其存储在存储过程中的变量中。
因此,例如,为了获得所有的反馈,一个单一的参赛者(如所有的评判1名艺术家),我将使用以下方法:
SELECT rndFeedback FROM recEntrantStatus WHERE roundId = 3 AND entrantId = @entrantId但是,我不知道如何使用它来收集当前一轮中所有评委对当前艺术家的反馈,并将其整齐地收集到一个声明变量中,然后可以在以后的插入中使用。
需要进一步澄清的设想;
它的第二轮和第十轮法官投票和留下反馈意见的单一参赛者。我需要收集反馈意见,在每一位法官的10条记录中,每一位法官都对一位指定的参赛者进行投票。然后,需要将其聚合到现有存储过程中的一个声明变量中。
每一张唱片看起来都是这样的:
id | judgeId | entrantId | roundId | rndFeedback
________________________________________________
1 | 5 | 22 | 2 | Awesome
1 | 8 | 22 | 2 | Really Nice Work
1 | 9 | 22 | 2 | The bass was a little heavy
1 | 10 | 22 | 2 | You Suck
1 | 11 | 22 | 2 | It was really good but lacking emotion
1 | 14 | 22 | 2 | You get my vote
1 | 15 | 22 | 2 | Nice Melody因此,最终,我希望收集entrantId = 22的所有反馈,作为一个包含以下内容的字符串:
Awesome Really Nice Work The bass was a little heavy You Suck It was really good but lacking emotion You get my vote Nice Melody如有任何帮助和建议,将不胜感激。
附注:rndFeedback是VARCHAR数据类型
发布于 2016-01-08 10:11:54
DECLARE @t TABLE (
id INT,
judgeId INT,
entrantId INT,
roundId INT,
rndFeedback VARCHAR(100)
)
INSERT INTO @t
VALUES
(1, 5 , 22, 2, 'Awesome'),
(1, 8 , 22, 2, 'Really Nice Work'),
(1, 9 , 22, 2, 'The bass was a little heavy'),
(1, 10, 22, 2, 'You Suck'),
(1, 11, 22, 2, 'It was really good but lacking emotion'),
(1, 14, 22, 2, 'You get my vote'),
(1, 15, 22, 2, 'Nice Melody'),
(1, 15, 23, 2, 'TEST'),
(1, 15, 23, 2, NULL),
(1, 15, 24, 2, NULL)
SELECT t1.entrantId, STUFF((
SELECT ' ' + rndFeedback
FROM @t t2
WHERE t2.entrantId = t1.entrantId
AND t2.roundId = 2
AND t2.rndFeedback IS NOT NULL
FOR XML PATH('')), 1, 1, '')
FROM (
SELECT DISTINCT entrantId
FROM @t
WHERE roundId = 2
AND rndFeedback IS NOT NULL
) t1产出-
----------- ----------------------------------------------------------------------------------------------------------------------------------
22 Awesome Really Nice Work The bass was a little heavy You Suck It was really good but lacking emotion You get my vote Nice Melody
23 TEST后http://www.codeproject.com/Articles/691102/String-Aggregation-in-the-World-of-SQL-Server
发布于 2016-01-08 10:44:13
是的你能做到的。我在下面的示例中使用了以下示例数据:
样本数据
/* Using a table variable allows everyone to
* share the same data.
*/
DECLARE @Sample TABLE
(
Id INT,
JudgeId INT,
EntrantId INT,
RoundId INT,
rndFeedBack VARCHAR(50)
)
;
/* Populated based on values supplied in OP.
*/
INSERT INTO @Sample
(
Id,
JudgeId,
EntrantId,
RoundId,
rndFeedBack
)
VALUES
(1, 5, 22, 2, 'Awesome'),
(1, 8, 22, 2, 'Really Nice Work'),
(1, 9, 22, 2, 'The bass was a little heavy'),
(1, 10, 22, 2, 'You Suck'),
(1, 11, 22, 2, 'It was really good but lacking emotion'),
(1, 14, 22, 2, 'You get my vote'),
(1, 15, 22, 2, 'Nice Melody'),
(1, 15, 22, 2, NULL)
;首先,需要声明一个变量来保存输出。确保它足够大,足以保存整个结果,否则您将得到一个修整值(修剪不会引起错误,因此很容易被忽略)。
此技术要求初始化变量,因为VARCHAR变量的默认值为NULL。和NULL +‘任意文本’=空。下面的select语句将每个返回的值添加到变量中。
最后,可以使用案例表达有条件地构建返回值。在本例中:
示例
/* This will hold the concatenated value.
* You must initialise this variable, to avoid NULL + text = NULL.
*/
DECLARE @Feedback VARCHAR(MAX) = '';
SELECT
@Feedback = @Feedback +
CASE
WHEN rndFeedBack IS NULL THEN ''
WHEN LEN(@Feedback) > 1 THEN ',' + rndFeedBack
ELSE rndFeedBack
END
FROM
@Sample
WHERE
EntrantId = 22
AND RoundId = 2
;
/* Check the returned value.
*/
SELECT
@Feedback
;编辑1:将ISNULL添加到示例代码中。
编辑2:将CASE表达式添加到示例代码中。前款增加了对案件的解释。将空记录添加到示例数据中。
https://stackoverflow.com/questions/34674357
复制相似问题