首页 > 解决方案 > 两个新列 SQL Server:一个带有记者 ID,一个带有每行记者数

问题描述

我正在尝试删除我的 SQL 服务器数据库中的一个列,该表是关于记者撰写的文章的。问题是每个记者都没有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

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

标签: sql-serverstring-aggregation

解决方案


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

在此处输入图像描述

演示

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


推荐阅读