2011-11-30 51 views
0

我有一個表中列出了單個id的兩個或更多不同日期。我想合併一個ID的所有日期。示例代碼如下。在sql server中使用xml路徑合併字段,顯示逗號,其中NULL

create table number(id nvarchar(255), billdate nvarchar(255)) 
insert into number(id,billdate) values ('56465','12/10/2011'),('56465','02/11/2011'), 
('46462','12/09/2009'),('46462','12/06/2010'),('32169','12/22/2009'), 
('32169','12/31/2011'),('86835','12/10/2010'),('86835','22-Jan-2010'), 
('65641',''),('65641','12-Aug-2009'),('22458','25-Aug-2007'),('22458','') 

對於合併我使用XML路徑的行如下

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate" 
from (select distinct ST2.id,(SELECT ST1.billdate + ',' AS [text()] 
from NUMBER ST1 where ST1.id=ST2.id ORDER BY ST1.id FOR XML PATH (''))billdate 
from NUMBER ST2)[Main] 

它可以正常使用這個樣本數據,但問題是我有大量的數據,而當我將此XML路徑如果日期爲NULL,則代碼逗號不會顯示,如ID 65641.對於我來說,在NULL位置顯示逗號很重要。我哪裏錯了?任何人都可以建議爲什麼它不顯示空位的逗號?

回答

0

我不確定我是否完全理解你,因爲65641的推定NULL值實際上是空白。爲了治療NULL值一樣空白,您可以使用此:

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-1,-1)) as "billdate" 
from 
(
    select distinct ST2.id, 
    (
     SELECT ISNULL(ST1.billdate + ',', ',') AS [text()] 
     from NUMBER ST1 
     where ST1.id=ST2.id 
     ORDER BY ST1.id 
     FOR XML PATH ('') 
    ) billdate 
    from NUMBER ST2 
)[Main] 

你可能會遇到的另一個問題是,如果只有一個空/空對於一個給定id值,你不會連它的單個逗號。發生這種情況的原因是一個空白值僅生成一個逗號,然後由您的LEFT語句剝離。你可以把它通過改變它像這樣獨自離開單逗號:

select Main.id,LEFT(Main.billdate,nullif(LEN(Main.billdate)-CASE WHEN LEN(Main.billdate) = 1 THEN 0 ELSE 1 END,-1)) as "billdate" 
from 
(
    select distinct ST2.id, 
    (
     SELECT ISNULL(ST1.billdate + ',', ',') AS [text()] 
     from NUMBER ST1 
     where ST1.id=ST2.id 
     ORDER BY ST1.id 
     FOR XML PATH ('') 
    ) billdate 
    from NUMBER ST2 
)[Main] 

你還有問題,其中之一是,你有日期沒有明確的排序,但我希望,涵蓋了你的問題。如果沒有,澄清,我會試圖幫助更多。

相關問題