2017-04-22 1 views
2

Ich habe eine SQL-Abfrage unten, die ich als XML mit der FOR XML-Syntax formatieren möchte.Verwenden von FOR XML zum Gruppieren gegen 2 SQL-Tabellen

Dies ist ein Beispiel für das XML-Format, in dem die Abfrage aussehen soll.

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

Bis jetzt konnte ich das nicht ganz richtig bekommen. Ich habe Folgendes versucht, aber dies gruppiert die Bestellungen nicht.

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') 

Antwort

3

Hier ist ein Ansatz

Beispiel

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') 

Returns

<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> 
+0

Sehr nett! Gibt es im Allgemeinen einen Unterschied zwischen der "Select distinct" abgeleiteten Tabelle und der "Group by ID, created"? http://rextester.com/ZLS77092 – SqlZim

+1

@SqlZim Bei größeren Datensätzen habe ich festgestellt, dass DISTINCT schneller ist, nicht viel, aber bemerkbar. Das mag Stammeswissen gewesen sein, also werde ich noch einmal darüber sprechen und ein paar Benchmarks ausführen. –

+1

@SqlZim Bei einer Stichprobengröße von 80.000 Datensätzen betrug die durchschnittliche Laufzeit des DISTINCT 327 ms, während die GROUP BY 412MS betrug –

0

Dies ist für mich arbeiten.

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') 
Verwandte Themen