在元素FOR XML下对值进行分组

时间:2018-04-14 15:08:42

标签: sql sql-server

我正在尝试使用SQL Server 2012中的FOR XML格式化查询的输出。

每个PART_NO可以有不同数量的SUPPLIER_PART_NUMBER映射到它。

该表格包含以下格式的数据。

    PART_NO SUPPLIER_PART_NO
    ------- ----------------
    AAA     1
    AAA     2
    BBB     3
    BBB     4
    BBB     5

所需的输出如下,其中AAA部件有两个供应商部件号,BBB部件有三个供应商部件号,供应商部件号嵌套在部件号下面。

    <root>
        <item PartNo ="AAA">
            <mpn>1</mpn>
            <mpn>2</mpn> 
        </item>
        <item PartNo ="BBB">
            <mpn>3</mpn>
            <mpn>4</mpn> 
            <mpn>5</mpn>
        </item>
    </root>

我可以得到的最接近的是,但这不会将mpn归入PartNo下:

SELECT  
    [PART_NO] as 'item/@PartNo',
    [SUPPLIER_PART_NO] as 'mpn'
FROM 
    [dbo].[supplier_part_mapping2]
ORDER BY 
    PART_NO
FOR XML PATH('') , ROOT('root');

提前谢谢

1 个答案:

答案 0 :(得分:0)

试试这个:

SELECT 
    p1.PART_NO as 'item/@PartNo',
    (SELECT 
         SUPPLIER_PART_NO AS 'mpn'
     FROM
         [dbo].[supplier_part_mapping2] p2
     WHERE
         p1.PART_NO = p2.PART_NO
     FOR XML PATH(''), TYPE) AS 'item'
FROM 
    [dbo].[supplier_part_mapping2] p1
GROUP BY
    PART_NO
ORDER BY 
    PART_NO
FOR XML PATH('') , ROOT('root');

这应该产生:

https://github.com/Achse/geth-jsonrpc-php-client

您基本上需要分组 PART_NO,这样每个不同的<item>只能获得一个PART_NO条目,您需要抓住“子元素“作为子查询,在一个父节点下将它们全部列在一起。