使用 UNION 删除重复日期但保留相同数据
Using UNION to remove duplicate date but keep the same data
全部晕,
希望你能帮助我。我正在使用 SQL 服务器。
我有这样的 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>
我怎样才能得到这种数据:
refNo doNumber Item qty uom
--------------------------------------------------------------------
S350282535-100060 0 114495 2 PC
S350282535-100061 1 114496 2 PC
S350282535-100061 1 114497 2 PC
这是我已经尝试过的查询:
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
我使用了 UNION,但是结果并不如我所愿,有谁能帮助我吗?非常感谢你的帮助。
假设 XML 数据存储在名为 @xml
的 XML 变量中:
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>'
以下是使用 XML methods 和 XPath/XQuery 而不是旧的 OPENXML 获得预期结果的一种可能方法:
;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
全部晕,
希望你能帮助我。我正在使用 SQL 服务器。 我有这样的 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>
我怎样才能得到这种数据:
refNo doNumber Item qty uom
--------------------------------------------------------------------
S350282535-100060 0 114495 2 PC
S350282535-100061 1 114496 2 PC
S350282535-100061 1 114497 2 PC
这是我已经尝试过的查询:
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
我使用了 UNION,但是结果并不如我所愿,有谁能帮助我吗?非常感谢你的帮助。
假设 XML 数据存储在名为 @xml
的 XML 变量中:
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>'
以下是使用 XML methods 和 XPath/XQuery 而不是旧的 OPENXML 获得预期结果的一种可能方法:
;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