2017-01-24 8 views
2
declare @textline table (lineid int, textline varchar(100)) 

insert Into @textline (lineid, textline) 
values (1, 'AAAA BBBB CCCC DDDD'), 
     (2, '1212 3434 5656 7878'), 
     (3, 'ABCD DEFG GHIJ JKLM'), 
     (4, 'AAAA BBBB CCCC DDDD'), 
     (5, '1212 3434 5656 7878'), 
     (6, 'ABCD DEFG GHIJ JKLM') 

Select TextLine Line 
    From @textline  
    For Xml Path(''), Root('TextBlock') 
-- The result as 
<TextBlock> 
    <Line>AAAA BBBB CCCC DDDD</Line> 
    <Line>1212 3434 5656 7878</Line> 
    <Line>ABCD DEFG GHIJ JKLM</Line> 
    <Line>AAAA BBBB CCCC DDDD</Line> 
    <Line>1212 3434 5656 7878</Line> 
    <Line>ABCD DEFG GHIJ JKLM</Line> 
</TextBlock> 

に、この予想される結果をTSQLコード(SQL Serverを)修正する方法は?SQLサーブ - どのようにXMLパスのサブノードにグループn行

我々は、グループn行(この場合の3行)を次のように予想される結果たい:あなたは整数除算でCTEにグループ化列を生成し、それを使用することができる

<TextBlock> 
    <Line>AAAA BBBB CCCC DDDD</Line> 
    <Line>1212 3434 5656 7878</Line> 
    <Line>ABCD DEFG GHIJ JKLM</Line> 
</TextBlock> 
<TextBlock> 
    <Line>AAAA BBBB CCCC DDDD</Line> 
    <Line>1212 3434 5656 7878</Line> 
    <Line>ABCD DEFG GHIJ JKLM</Line> 
</TextBlock> 

答えて

2

declare @textline table (lineid int, textline varchar(100)) 

insert Into @textline (lineid, textline) 
values (1, 'AAAA BBBB CCCC 1111'), 
     (2, '1212 3434 5656 1122'), 
     (3, 'ABCD DEFG GHIJ 1133'), 
     (4, 'AAAA BBBB CCCC 2211'), 
     (5, '1212 3434 5656 2222'), 
     (6, 'ABCD DEFG GHIJ 2233'); 

(結果の行をマークするために、最後の桁を変更) - CTEは結果セットにグループ化ランクを追加します

WITH Numbered AS 
(
    SELECT tl.lineid 
      ,tl.textline 
      ,(ROW_NUMBER() OVER(ORDER BY tl.lineid)-1)/3 AS GroupRank 
    FROM @textline AS tl 
) 
--Each grouping rank is one row, which returns all related lines 
--The XML parts are put together with the outer `FOR XML` 
SELECT (
     SELECT innerTL.textline AS Line 
     FROM Numbered AS innerTL 
     WHERE innerTL.GroupRank=Numbered.GroupRank 
     FOR XML PATH(''),TYPE 
     ) 
FROM Numbered 
GROUP BY GroupRank 
FOR XML PATH('TextBlock'); 

結果

<TextBlock> 
    <Line>AAAA BBBB CCCC 1111</Line> 
    <Line>1212 3434 5656 1122</Line> 
    <Line>ABCD DEFG GHIJ 1133</Line> 
</TextBlock> 
<TextBlock> 
    <Line>AAAA BBBB CCCC 2211</Line> 
    <Line>1212 3434 5656 2222</Line> 
    <Line>ABCD DEFG GHIJ 2233</Line> 
</TextBlock> 
2

を列をメインクエリでグループ化し、サブクエリでCTEに再度参加して行の値を取得します。あなたがランク

あなたのテストシナリオをグループ化するとして使用することができます整数の除算を使用することができます

with C as 
(
    select (row_number() over(order by T.lineid) - 1)/3 as grp, 
     T.textline, 
     T.lineid 
    from @textline as T 
) 
select (
     select C2.textline as Line 
     from C as C2 
     where C1.grp = C2.grp 
     order by C2.lineid 
     for xml path(''), type 
     ) 
from C as C1 
group by C1.grp 
order by C1.grp 
for xml path('TextBlock'); 
関連する問題