【问题标题】:Concatenating rows in SQL Server在 SQL Server 中连接行
【发布时间】:2021-03-02 05:22:07
【问题描述】:

我使用的是 Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64)

我正在尝试获取如下所示的数据:

User    FieldId     Value
----------------------------
1       1           John
1       2           Smith
2       1           Roberta
2       2           Smith
3       1           Mark
3       2           Smith

并将其转换为:

User Name
-------------------
1    John Smith
2    Roberta Smith
3    Mark Smith

我在https://www.mytecbits.com/microsoft/sql-server/concatenate-multiple-rows-into-single-string#:~:text=SQL%20Server%3A%20Concatenate%20Multiple%20Rows%20Into%20Single%20String,version%202008%20and%20higher.%20...%203%20Using%20STRING_AGG找到了几个例子

但它似乎不适用于我的场景。

【问题讨论】:

    标签: sql sql-server tsql pivot aggregate-functions


    【解决方案1】:

    如果您总是在任何地方都有确切的 FieldId 1 和 2,您可以使用以下代码:

    select x1.User, concat(x1.Value,' ',x2.Value)
    FROM
    (select User,Value from tablename where FieldId = 1) as x1
    inner join
    (select User,Value from tablename where FieldId = 2) as x2
    on x1.User = x2.User
    

    它的工作原理是首先创建两个数据集,其中一个包含来自 FieldID = 1 的表中的用户和值数据,另一个具有 FieldID = 2 的数据集 看起来像这样:

    x1
    
    User         Value
    --------------------
    1            John
    2            Roberta
    3            Mark
    
    x2
    User         Value
    ---------------------
    1            Smith
    2            Smith
    3            Smith
    

    然后它将它们连接到一个表中,我们可以从中简单地连接所需的字符串

    x1.User  x1.Value  x2.Value
    ----------------------------
    1       John        Smith
    2       Roberta     Smith
    3       Mark        Smith
    

    【讨论】:

      【解决方案2】:

      你可以使用string_agg():

      select user, string_agg(value, ' ') within group(order by fieldid) as name
      from mytable
      group by user
      

      如果总是只有 2 个fieldids、12,那么条件聚合更简单(并且适用于所有版本的 SQL Server):

      select user,
          max(case when fieldid = 1 then value end) 
              + ' ' 
              + max(case when fieldid = 2 then value end) as name
      from mytable
      group by user
      

      【讨论】:

      • string_agg 在 SQL Server 2014 中不可用。
      • 正如 Alejandro 所写,string_agg 在我的 SQL Server 版本中不可用。我能够成功使用条件聚合方法。
      猜你喜欢
      • 1970-01-01
      • 2021-05-15
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多