两个新列 SQL 服务器:一个带有记者 ID,一个带有每行记者数

Two New Column SQL Server: one with journalist Id, one with count of journalist per row

我正在尝试切出我的 SQL 服务器数据库中的一个列,其中 table 是关于记者撰写的文章。问题是没有每个记者的Id,但是有"Writer"栏,里面放的是记者的名字,如果he/she成对写,名字一个接一个。

我想实现的是:

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

知道如何实现吗?

由于您使用的是 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, ',');  

Demo

关于 STRING_SPLIT 我要添加的唯一评论是接收拆分值的列必须称为 value。但是,我们可以将该列别名为另一个名称,例如Writer,如果我们想这样做的话。

使用 Substring 和拆分值函数得到相同的结果

SELECT a.Articleid, A.Title,  
 Split.a.value('.', 'VARCHAR(100)') AS Writer,a.Body,count(*) over (partition 
  by articleid) Writer_count    
   FROM  (SELECT articleid,body,Title,  
     CAST ('<M>' + REPLACE(Writer, ',', '</M><M>') + '</M>' AS XML) AS Writer 
       FROM  #article) AS A CROSS APPLY writer.nodes ('/M') AS Split(a);