[英]Extracting certain values from XML column
i have the following sql query:我有以下 sql 查询:
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)
Currently it will bring back everything, example:目前它将带回一切,例如:
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
how do i exclude the following from the results, this is from the same row in the xml column?我如何从结果中排除以下内容,这是来自 xml 列中的同一行?
DRN CR DR Amount Prodate
*12* 2p1rf 684pb 4686.23 2012-11-14
*12* 586io fdc25 4686.23 2012-11-16
i only want the query to bring back rows with one item in the xml column not mutliple values.我只希望查询带回 xml 列中的一项而不是多个值的行。
thank you谢谢你
how do i then go about to bring back only the first item in a row with multiple items:那么我如何才能只带回包含多个项目的连续第一项:
DRN CR DR Amount Prodate
*12* 2p1rf 684pb 4686.23 2012-11-14
*12* 586io fdc25 4686.23 2012-11-16
so i want to only see the item with the date 2012-11-14 not everything pertaining to the row?所以我只想看到日期为 2012-11-14 的项目而不是与该行有关的所有内容? i hope that makes sense?
我希望这是有道理的?
You should be able to do an inline aggregate and filter on that您应该能够进行内联聚合并对其进行过滤
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
Edit, after question addition编辑,添加问题后
Simply change the inline aggregate to a window function只需将内联聚合更改为窗口函数
In this case, I've chosen the row based on the lowest ProDate
在这种情况下,我选择了基于最低
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.