2012-11-28 49 views
1

我有以下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不是所有与排有关的东西?我希望这是有道理的?

回答

2

你应该能够做一个在线聚合和过滤对

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 
+0

感谢此作品完美,我可以问一个更多的问题吗? – user1854183

+0

我会举几个例子,如果该行包含多个: – user1854183

+0

@ user1854183:当然,也请添加示例数据/ XML请 – gbn