两个新列SQL Server:一个带有新闻工作者ID,一个带有每行新闻工作者计数

时间:2018-08-22 08:32:01

标签: sql-server string-aggregation

我正在尝试在SQL Server数据库中切出一列,其中的表与记者撰写的文章有关。问题在于,每个新闻工作者都没有ID,但是在“作家”列中放置了新闻工作者的姓名,如果他/她成对写信,那么姓名将一个接一个。

我想要实现的是:

1)每个记者都被分配了自己的行和ID (我将其称为“ WriterId”)

2)第二行按该顺序计算新闻工作者的人数。

如何复制:

CREATE TABLE article (
ArticleId   int,
Title   varchar(50),
Writer  varchar(50),
Body    varchar(max)
);

并插入值:

INSERT INTO article (ArticleId, Title, Writer, Body)
VALUES 
(1, 'Title Article 1', 'Sabao Fulano, Sapato Feio, Jose Perreira', 'Body of Article 1'), 
(2, 'Title Article 2', 'Feijao Mauricio', 'Body of Article 2'), 
(3, 'Title Article 3', 'Toze Jose', 'Body of Article 3');

理想的输出:

ArticleId   Title             Writer        WriterId Count(Writer)    Body
    1       Title Article 1   Sabao Fulano        W1     3            Body of Article 1
    1       Title Article 1   Sapato Feio         W2     3            Body of Article 1
    1       Title Article 1   Jose Perreira       W3     3            Body of Article 1
    2       Title Article 2   Feijao Mauricio     W4     1            Body of Article 2
    3       Title Article 3   Toze Jose           W5     1            Body of Article 3

任何线索如何实现这一目标?

1 个答案:

答案 0 :(得分:4)

由于您使用的是SQL Server 2017,因此使用STRING_SPLIT有一个便捷的解决方案:

SELECT
    ArticleId,
    Title,
    Body,
    COUNT(*) OVER (PARTITION BY ArticleId) writer_count
    VALUE AS Writer
FROM article  
CROSS APPLY STRING_SPLIT(Writer, ',');  

enter image description here

Demo

在这里我唯一要补充的关于STRING_SPLIT的评论是,接收拆分值的列必须称为value。但是,然后我们可以将该列作为其他名称的别名,例如Writer,如果我们想这样做。