我们假设我有一个名为Details
的表格,其中有4列:OrderNo
,Name
,Qty
和Weight
。我正在遍历表并选择所需的字段,从数据中连接一个字符串。例如:
-----------------------------------------------------------------
| OrderNo | Name | Qty | Weight |
-----------------------------------------------------------------
| a1234 | HDMI_Cable | 2 | 0.1 |
| a1234 | Aux_Cable | 1 | 0.1 |
| b5346 | 2.1_Speakers | 1 | 3.5 |
| t5485 | 3.5mm_Adapter | 5 | 0.1 |
-----------------------------------------------------------------
因此,对于这些数据,我要做的是遍历表并连接用分号(;)分隔的数据,然后用'>'分隔每行。对于第二和第三行,这将给我:
a1234;Aux_Cable;1;0.1>b5346;2.1_Speakers;1;3.5>
复杂的部分是,当订单号相同时,我想在不重复订单号的情况下将其附加到上一行。例如,第1行和第2行看起来像:
a1234;HDMI_Cable;2;0.1;Aux_Cable;1;0.1>
我尝试过使用带有嵌套select语句的IF循环和案例,但我一直遇到无休止的错误,似乎无法让它工作。任何人都知道如何做到这一点或是否可以做到?谢谢你的阅读!
答案 0 :(得分:2)
您可以使用SQL Server XML extensions to concatenate rows,但由于您的要求,您需要执行两次操作:
第一个是连接类似的命令:
SELECT OrderConcat = OrderNo
+ ( SELECT ';' + Name
+ ';' + CAST(Qty AS VARCHAR(10))
+ ';' + CAST(Weight AS VARCHAR(10))
FROM T T2
WHERE T.OrderNo = T2.OrderNo
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
FROM T
GROUP BY OrderNo;
这给出了:
ORDERCONCAT
------------------------------------
a1234;HDMI_Cable;2;0.10;Aux_Cable;1;0.10
b5346;2.1_Speakers;1;3.50
t5485;3.5mm_Adapter;5;0.10
<强> Example on SQL Fiddle 强>
下一步是将这些连接成一行:
WITH Orders AS
( SELECT OrderConcat = OrderNo
+ ( SELECT ';' + Name
+ ';' + CAST(Qty AS VARCHAR(10))
+ ';' + CAST(Weight AS VARCHAR(10))
FROM T T2
WHERE T.OrderNo = T2.OrderNo
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM T
GROUP BY OrderNo
)
SELECT STUFF(( SELECT '>' + OrderConcat
FROM Orders
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX'), 1, 1, '');
给出最终结果:
a1234;HDMI_Cable;2;0.10;Aux_Cable;1;0.10>b5346;2.1_Speakers;1;3.50>t5485;3.5mm_Adapter;5;0.10
<强> Example on SQL Fiddle 强>
答案 1 :(得分:1)
如果您需要转换它们的非字符串字段,这可能是最简单的SQL Server处理XML
,否则:
SELECT DISTINCT OrderNo + ';'+
STUFF((SELECT DISTINCT ';' + Name + ';'+Qty+';'+Weight
FROM Table1 b
WHERE a.OrderNo = b.OrderNo
FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)')
,1,1,'')+'>'
FROM Table1 a
演示:SQL Fiddle