首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从多行/记录的命名列聚合数据

从多行/记录的命名列聚合数据
EN

Stack Overflow用户
提问于 2016-01-08 10:08:54
回答 2查看 57关注 0票数 0

我正在更新一个网站,这个网站本质上是一个竞赛,每个参赛者都由(n)个评委投票决定,每个评委都会留下反馈信息,这些反馈信息存储在“反馈”栏的表格“recEntrantStatus”中。

我需要能够收集所有反馈给一个给定的进入者,并整理这些数据,然后将其存储在存储过程中的变量中。

因此,例如,为了获得所有的反馈,一个单一的参赛者(如所有的评判1名艺术家),我将使用以下方法:

代码语言:javascript
复制
SELECT rndFeedback FROM recEntrantStatus WHERE roundId = 3 AND entrantId = @entrantId

但是,我不知道如何使用它来收集当前一轮中所有评委对当前艺术家的反馈,并将其整齐地收集到一个声明变量中,然后可以在以后的插入中使用。

需要进一步澄清的设想;

它的第二轮和第十轮法官投票和留下反馈意见的单一参赛者。我需要收集反馈意见,在每一位法官的10条记录中,每一位法官都对一位指定的参赛者进行投票。然后,需要将其聚合到现有存储过程中的一个声明变量中。

每一张唱片看起来都是这样的:

代码语言:javascript
复制
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的所有反馈,作为一个包含以下内容的字符串:

代码语言:javascript
复制
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数据类型

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-08 10:11:54

代码语言:javascript
复制
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

产出-

代码语言:javascript
复制
----------- ----------------------------------------------------------------------------------------------------------------------------------
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

票数 1
EN

Stack Overflow用户

发布于 2016-01-08 10:44:13

是的你能做到的。我在下面的示例中使用了以下示例数据:

样本数据

代码语言:javascript
复制
/* 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语句将每个返回的值添加到变量中。

最后,可以使用案例表达有条件地构建返回值。在本例中:

  • 空字符串替换NULL。
  • 如果@Feeback已经包含文本,则rndFeedBack以逗号作为前缀。

示例

代码语言:javascript
复制
/* 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表达式添加到示例代码中。前款增加了对案件的解释。将空记录添加到示例数据中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34674357

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档