两个新列 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, ',');
关于 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);
我正在尝试切出我的 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, ',');
关于 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);