Sql将行数据连接到列中

Sql将行数据连接到列中,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,数据集: +-----------------+--------+---------+ | TransNo | Serial | Project | +-----------------+--------+---------+ | A00000000000001 | 1 | 100 | | A00000000000001 | 2 | 200 | | A00000000000001 | 3 | 201 | | A00000000

数据集:

+-----------------+--------+---------+
|     TransNo     | Serial | Project |
+-----------------+--------+---------+
| A00000000000001 |      1 |     100 |
| A00000000000001 |      2 |     200 |
| A00000000000001 |      3 |     201 |
| A00000000000001 |      4 |     101 |
| A00000000000002 |      1 |     100 |
| A00000000000002 |      2 |     101 |
| A00000000000003 |      1 |     100 |
| A00000000000003 |      2 |     200 |
| A00000000000004 |      1 |     200 |
| A00000000000004 |      2 |     100 |
| A00000000000005 |      1 |     101 |
| A00000000000005 |      2 |     100 |
+-----------------+--------+---------+
我想按项目和事务分区以新的列顺序合并项目,如下所示。 [项目将由订单ASC合并]

输出:

    +-----------------+--------+---------+------------------+
    |     TransNo     | Serial | Project | CProject         |
    +-----------------+--------+---------+------------------+
    | A00000000000001 |      1 |     100 |     100101200201 |
    | A00000000000001 |      2 |     200 |     100101200201 |
    | A00000000000001 |      3 |     201 |     100101200201 |
    | A00000000000001 |      4 |     101 |     100101200201 |
    | A00000000000002 |      1 |     100 |     100101       |
    | A00000000000002 |      2 |     101 |     100101       |
    | A00000000000005 |      1 |     101 |     100101       |
    | A00000000000005 |      2 |     100 |     100101       |
    | A00000000000003 |      1 |     100 |     100200       |
    | A00000000000003 |      2 |     200 |     100200       |
    | A00000000000004 |      1 |     200 |     100200       |
    | A00000000000004 |      2 |     100 |     100200       |
    +-----------------+--------+---------+------------------+
更新1:

如果我希望我的输出顺序是串行的,而不是项目,该怎么办

    +-----------------+--------+---------+------------------+
    |     TransNo     | Serial | Project | CProject         |
    +-----------------+--------+---------+------------------+
    | A00000000000001 |      1 |     100 |     100200201101|
    | A00000000000001 |      2 |     200 |     100200201101|
    | A00000000000001 |      3 |     201 |     100200201101|
    | A00000000000001 |      4 |     101 |     100200201101|
    | A00000000000002 |      1 |     100 |     100101       |
    | A00000000000002 |      2 |     101 |     100101       |
    | A00000000000005 |      1 |     101 |     101100       |
    | A00000000000005 |      2 |     100 |     101100       |
    | A00000000000003 |      1 |     100 |     100200       |
    | A00000000000003 |      2 |     200 |     100200       |
    | A00000000000004 |      1 |     200 |     200100       |
    | A00000000000004 |      2 |     100 |     200100       |
    +-----------------+--------+---------+------------------+
这样试试

SELECT t1.*,t2.CProject
FROM t AS t1
JOIN (
    SELECT SS.TransNo, (
            SELECT ' ' + US.Project     
            FROM t US
            WHERE US.TransNo = SS.TransNo
            FOR XML PATH('')
        ) CProject
    FROM t SS
    GROUP BY SS.TransNo
    ORDER BY SS.Serial
) t2 ON t1.TransNo = t2.TransNo
输出-

TransNo              Serial      Project     CProject
-------------------- ----------- ----------- --------------
A00000000000001      1           100         100101200201
A00000000000001      2           200         100101200201
A00000000000001      3           201         100101200201
A00000000000001      4           101         100101200201
A00000000000002      1           100         100101
A00000000000002      2           101         100101
A00000000000003      1           100         100200
A00000000000003      2           200         100200
A00000000000004      1           200         100200
A00000000000004      2           100         100200
A00000000000005      1           101         100101
A00000000000005      2           100         100101
使用
[text()]
-

100101200201
<Project>100</Project><Project>101</Project><Project>200</Project><Project>201</Project>
没有
[text()]
-

100101200201
<Project>100</Project><Project>101</Project><Project>200</Project><Project>201</Project>

“CProject”下的数字有什么意义?我看不到明显的模式。对于transNo'A00000000000001'项目,CProject是按升序合并其所有项目。请参见此事务中存在4个项目100、200、201、101,按ASC顺序合并它们将是100101200201
GROUP_CONCAT
SQL Server上不存在错误:order by子句在视图、内联函数、派生表、子需求和公共表表达式中无效,除非TOP,还指定了XML的偏移量或。子查询中的排序可能导致意外结果非常优雅的解决方案!棒 极 了但有一个小问题。假设对于项目100、200、200、101,是否可以返回100101200?Hi Devart,什么是
[text()]
,它是来自xpath的函数?@Ogrish Man,
text()
函数只检索元素值,而不检索元素值nodes@Smart003不客气;)也请检查这篇文章——愿原力与你同在:))