2017-06-22 5 views
1

ヘイローすべてを保つため、私はあなたが私を助けることを願って重複した日付を削除しますが、同じデータ

するUNIONを使用しました。私はSQL Serverを使用しています。 私はこのような、このXMLデータを持っている:私はこの種のデータを得ることができる方法

<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root> 

DECLARE @XML AS XML, @hDoc AS INT, @SQL NVARCHAR (MAX), @flagParameter AS 
INT 

SELECT @XML = XMLData FROM XMLwithOpenXML 

EXEC sp_xml_preparedocument @hDoc OUTPUT, @XML 
SET @flagParameter = 2 

SELECT item, qty,uom, refNo, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
    item [int], 
    qty [int], 
    uom [nvarchar] (6), 
    refNo [nvarchar] (50), 
    remarks [nvarchar] (100), 
    reason [nvarchar] (100) 
) 

SELECT refNo, doNumber 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int] 
) 

SELECT refNo , doNumber, item--, qty,uom, remarks, reason 
FROM OPENXML(@hDoc, 'Root/Detail',@flagParameter) 
WITH 
(
refNo [nvarchar] (50), 
doNumber [int], 
item [int], 
qty [int], 
uom [nvarchar] (6), 
remarks [nvarchar] (100), 
reason [nvarchar] (100) 
) 

UNION 

SELECT refNo, doNumber, One as Item--, two as two, three as three, four as 
four 
FROM OPENXML(@hDoc, 'Root/Header',@flagParameter) 
WITH 
(
refNo [nvarchar](50), 
doNumber [int], 
one [int], 
two [int], 
three [int], 
four [int] 
) EXEC sp_xml_removedocument @hDoc 

私が使用:

ここ
refNo     doNumber Item  qty uom 
-------------------------------------------------------------------- 
S350282535-100060  0   114495  2  PC 
S350282535-100061  1   114496  2  PC 
S350282535-100061  1   114497  2  PC 

は、私はすでに試してみましたが、私のクエリをですUNION、しかし結果は私の予想通りではありませんでしたが、誰も私を助けることができますか?あなたの助けに感謝します。 XMLデータは@xmlという名前のXML変数に格納されると仮定すると

+1

しようとしているUNIONクエリを共有してください。 –

+0

はい、確かに@keyur: – AgusmanPriantoro

+0

私の投稿に私の質問を追加しました。 @keyur – AgusmanPriantoro

答えて

0

DECLARE @xml XML = '<Root> 
    <Header> 
    <refNo>S350282535-100060</refNo> 
    <doNumber>0</doNumber> 
    </Header> 
    <Header> 
    <refNo>S350282535-100061</refNo> 
    <doNumber>1</doNumber> 
    </Header> 
    <Detail> 
    <item>114495</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100060</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114496</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
<Detail> 
    <item>114497</item> 
    <qty>2</qty> 
    <uom>PC</uom> 
    <refNo>S350282535-100061</refNo> 
    <remarks>-</remarks> 
    <reason>-</reason> 
</Detail> 
</Root>' 

次ではなく、古いOPENXMLのXML methodsおよびXPath/XQueryを使用して期待される結果を得るための1つの可能な方法である:

;WITH Header(refNo, doNumber) 
AS 
(
    SELECT 
     T.C.value('refNo[1]', 'varchar(100)') 
     ,T.C.value('doNumber[1]', 'int') 
    FROM @xml.nodes('/Root/Header') AS T(C) 
) 

SELECT 
    Header.* 
    ,T.C.value('item[1]', 'varchar(100)') 'item' 
    ,T.C.value('qty[1]', 'int') 'qty' 
    ,T.C.value('uom[1]', 'varchar(100)') 'uom' 
FROM @xml.nodes('/Root/Detail') AS T(C) 
INNER JOIN Header on T.C.value('refNo[1]', 'varchar(100)') = refNo 

demo

+0

ありがとう、それは魔法のように動作します。 – AgusmanPriantoro

+0

@AgusmanPriantoroようこそ。これまでにこれまでやったことがないので、[回答を受け入れる](https://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を検討するように思います問題の問題を解決しました。 – har07

関連する問題