选择语句SQL Server 2008中的IF循环?

时间:2013-12-13 17:34:08

标签: sql sql-server

我们假设我有一个名为Details的表格,其中有4列:OrderNoNameQtyWeight。我正在遍历表并选择所需的字段,从数据中连接一个字符串。例如:

-----------------------------------------------------------------
|     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循环和案例,但我一直遇到无休止的错误,似乎无法让它工作。任何人都知道如何做到这一点或是否可以做到?谢谢你的阅读!

2 个答案:

答案 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