代码之家  ›  专栏  ›  技术社区  ›  tavalendo

两个新的列SQL Server:一个具有记者Id,一个具有每行记者计数

  •  0
  • tavalendo  · 技术社区  · 8 年前

    我正在尝试切掉SQL server数据库中的一个列,其中的表是关于记者撰写的文章的。问题是,每个记者都没有身份证,但有“作家”一栏,记者的名字就放在这里,如果他/她是成对写的,名字就一个接一个。

    我想要实现的是:

    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
    

    你知道怎么做到吗?

    2 回复  |  直到 8 年前
        1
  •  4
  •   Tim Biegeleisen    8 年前

    由于您使用的是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

    我唯一想补充的 这里必须调用接收拆分值的列 value . 但是,我们可以将该列命名为另一个名称,例如。 Writer ,如果我们想这么做的话。

        2
  •  0
  •   Ranjith    8 年前

    使用子字符串和分割值函数得到相同的结果

    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);
    
    推荐文章