提取从XML列的特定值
问题描述:
我有以下SQL查询:提取从XML列的特定值
select
I.N.value('@DRN', 'varchar(50)') as DRN,
I.N.value('@CR_GUID', 'varchar(50)') AS CR,
I.N.value('@DR_GUID', 'varchar(50)') AS DR,
I.N.value('@AMOUNT', 'money') as Amount,
I.N.value('@DATE', 'Date') as ProDate
from Table as T
cross apply T.column.nodes('/ITEMS/ITEM') as I(N)
目前,它会带回的一切,例如:
DRN CR DR Amount Prodate
12 2p1rf 684pb 4686.23 2012-11-14
12 586io fdc25 4686.23 2012-11-16
13 hnv7p 19i6f 1800.00 2012-11-20
14 cd7k0 9s2vc 570.50 2012-11-20
15 pm78s qw3d5 8500.00 2012-11-23
如何排除从结果如下,这来自xml列中的同一行吗?
DRN CR DR Amount Prodate
*12* 2p1rf 684pb 4686.23 2012-11-14
*12* 586io fdc25 4686.23 2012-11-16
我只希望查询带回带有xml列中的一个项目的行而不是多重值。
谢谢
我怎么然后去约只需带回的第一个项目在一排多个项目:
DRN CR DR Amount Prodate
*12* 2p1rf 684pb 4686.23 2012-11-14
*12* 586io fdc25 4686.23 2012-11-16
,所以我想只能看到日期的项目2012- 11-14不是所有与排有关的东西?我希望这是有道理的?
答
你应该能够做一个在线聚合和过滤对
SELECT
X.DRN, X.CR, X.DR, X.Amount, X.ProDate
FROM
(
SELECT
COUNT(*) OVER (PARTITION BY I.N.value('@DRN', 'varchar(50)')) AS CountPerDRN,
I.N.value('@DRN', 'varchar(50)') as DRN,
I.N.value('@CR_GUID', 'varchar(50)') AS CR,
I.N.value('@DR_GUID', 'varchar(50)') AS DR,
I.N.value('@AMOUNT', 'money') as Amount,
I.N.value('@DATE', 'Date') as ProDate
from
MyTable as T
cross apply
T.Mycolumn.nodes('/ITEMS/ITEM') as I(N)
) X
WHERE
X.CountPerDRN= 1
编辑,问题加入后
只需将内嵌合计变为一窗口函数
在这种情况下,我已选择基于最低的排ProDate
SELECT
X.DRN, X.CR, X.DR, X.Amount, X.ProDate
FROM
(
SELECT
ROW_NUMBER() OVER (
PARTITION BY I.N.value('@DRN', 'varchar(50)')
ORDER BY I.N.value('@DATE', 'Date')
) AS rnPerDRN,
I.N.value('@DRN', 'varchar(50)') as DRN,
I.N.value('@CR_GUID', 'varchar(50)') AS CR,
I.N.value('@DR_GUID', 'varchar(50)') AS DR,
I.N.value('@AMOUNT', 'money') as Amount,
I.N.value('@DATE', 'Date') as ProDate
from
MyTable as T
cross apply
T.Mycolumn.nodes('/ITEMS/ITEM') as I(N)
) X
WHERE
X.rnPerDRN = 1
感谢此作品完美,我可以问一个更多的问题吗? – user1854183
我会举几个例子,如果该行包含多个: – user1854183
@ user1854183:当然,也请添加示例数据/ XML请 – gbn