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不客气;)也请检查这篇文章——愿原力与你同在:))