【问题标题】:SQL SERVER Combine multiple rows with multiple columns into single row with single columnSQL SERVER 将多行多列组合成单行单列
【发布时间】:2023-03-09 22:37:01
【问题描述】:

好吧,伙计们,这几天让我翻白眼了。假设我有两个表(或更多),如下所示。

表 1

ID  | NAME      | DATE          | MORE COLS....
1   | MARK      | 2018-31-10    | ....
2   | JOHN      | 2018-29-10    | ....
...

表2

FK_TBL1_ID | Data1     | Data2     | 
1          | 11111     | 33333     | 
1          | 22222     | 44444     | 
2          | 12345     | 67899     | 
...

我想将每行的多个列与这些表的相同 id 组合成 A SINGLE ROWSINGLE COLUMN,如下所示。每个新的“行”都将用';'与前一个分开。

查询结果

ID  | NAME      | DATE          |       Data1Data2        | 
1   | MARK      | 2018-31-10    |  1111 3333; 2222 4444;  | 
2   | JOHN      | 2018-29-10    |  12345 67899            | 

你会怎么做呢?我在 FOR XML PATH 上找到了示例,但仅当多行包含两列并在不同行上组合时。

【问题讨论】:

  • 我已为您删除了冲突的标签。请不要在您的问题中标记不相关的 RDBMS,它实际上会使那些试图回答的人更加困惑,或者延迟您获得一个(因为志愿者不知道什么语法对您实际使用的 RDBMS 有效) .

标签: sql sql-server for-xml-path


【解决方案1】:

以下是您的数据示例:

select t1.*,
       stuff( (select '; ' + coalesce(data1, '') + ' ' + coalesce(data2, '')
               from table2 t2
               where t2.FK_TBL1_ID = t1.id
               for xml path ('')
              ), 1, 2, ''
            ) as Data1Data2
from table1 t1;

【讨论】:

  • 哇,真快,谢谢 Gordon!我稍微编辑了这个问题,在结果集上犯了一个错误。这会改变事情吗?你能否解释一下为什么它是“1, 2”而不是“1,1”作为 STUFF 参数?
  • 我也刚刚注意到,如果一行的一列中有一个 NULL 值,那么结果集中不会出现任何内容。为什么会这样,我该如何避免?
  • @JasonA 写 ISNULL(data1,'') 和 ISNULL(data2,'') 然后它应该修复任何值是否为空,然后将 LTRIM 放在 LTRIM(STUFF((code
猜你喜欢
  • 2013-12-31
  • 1970-01-01
  • 2014-03-08
  • 1970-01-01
  • 1970-01-01
  • 2012-10-12
  • 2021-10-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多