使用FOR XML对2个sql表进行分组

时间:2017-04-22 01:41:02

标签: sql sql-server xml

我在下面有一个SQL查询,我想使用FOR XML语法格式化为XML。

SELECT
  gr.id,
  gr.created,
  ts.ordernumber
FROM trGrouped gr
INNER JOIN transactions ts
  ON ts.grouped_id = gr.id
WHERE ts.ordernumber IN ('4003970100000383', '4003970100000376', '4003970100000369', '1022108100000018')

这是我希望查询看起来像XML格式的一个例子。

<trans_groups>
  <grouped id="56" created="4/14/2017">
    <ordernumber>1022108100000001</ordernumber>
    <ordernumber>1022108100000002</ordernumber>
    <ordernumber>1022108100000003</ordernumber>
  </grouped>
  <grouped id="57" created="4/14/2017">
    <ordernumber>1022109100000001</ordernumber>
    <ordernumber>1022109100000002</ordernumber>
  </grouped>
</trans_groups>

到目前为止,我还没有能够做到这一点。我尝试了以下但是这不是对订单进行分组。

select gr.id as [@id], gr.created as [@created],
    (
    SELECT ts.ordernumber as ordernumber
    )
FROM trGrouped gr inner join transactions ts on ts.grouped_id = gr.id
    where ts.ordernumber in('4003970100000383', '4003970100000376', '4003970100000369', '1022108100000018')
FOR XML PATH('grouped'), ROOT('trans_groups')

2 个答案:

答案 0 :(得分:3)

这是一种方法

示例

Declare @YourTable table (id int,created date, ordernumber varchar(25))
Insert Into @YourTable values
 (56,'04/14/2017','1022108100000001')
,(56,'04/14/2017','1022108100000002')
,(56,'04/14/2017','1022108100000003')
,(57,'04/14/2017','1022109100000001')
,(57,'04/14/2017','1022109100000002')

Select [@id]      = id
      ,[@created] = convert(VARCHAR(10), created, 101)
      ,(
        Select ordernumber
         From  @YourTable A1
         Where A1.id = A.id
         For XML Path(''), type
       )
 From  (Select Distinct ID,Created From @YourTable ) A
 For XML Path('grouped'), Root('trans_groups')

<强>返回

<trans_groups>
  <grouped id="56" created="04/14/2017">
    <ordernumber>1022108100000001</ordernumber>
    <ordernumber>1022108100000002</ordernumber>
    <ordernumber>1022108100000003</ordernumber>
  </grouped>
  <grouped id="57" created="04/14/2017">
    <ordernumber>1022109100000001</ordernumber>
    <ordernumber>1022109100000002</ordernumber>
  </grouped>
</trans_groups>

答案 1 :(得分:0)

这对我有用。

select gr.id as [@id], gr.created as [@created],
    (
    SELECT ordernumber as ordernumber from transactions where grouped_id = grouped_id
    and ordernumber in ('4003970100000383', '4003970100000376', '4003970100000369', '1022108100000018')
    FOR XML path(''), type
    )
FROM (SELECT distinct gr.id, created FROM trGrouped gr inner join transactions ts on ts.grouped_id = gr.id
    where ts.ordernumber in('4003970100000383', '4003970100000376', '4003970100000369', '1022108100000018')) gr 
FOR XML PATH('grouped'), ROOT('trans_groups')