2013-11-24 103 views
-1

我的表結構如下:SQL服務器的XML查詢

date    Id  Value 
    -------------------------------- 
    01/01/2005 50000  5    
    01/01/2006 50000  6 
    01/01/2007 50000  7 
    01/01/2005 50001  8 
    01/01/2006 50001  9 
    01/01/2007 50001  10 

我想輸出以下格式在SQL Server中使用for xml的XML:

<Date date = "01/01/2005"> <Id dealId=50000" value="5"/> <Id dealId=50001" value="8"/> </Date> <Date date = "01/01/2006"> <Id dealId=50000" value="6"/> <Id dealId=50001" value="9"/> </Date> 

它如果有人能幫助我解決SQL Server中的查詢問題,那將會非常有幫助。我自己嘗試過其中的一些,但我沒有得到確切的輸出結果。

+2

你應該展示你所做的一個嘗試,這表明你已經嘗試了一些東西,並且可以給出更好的答案來解釋代碼錯誤的地方,這有助於人們的學習。 –

回答

2
-- using your provided values: 
DECLARE @table TABLE ([date] DATE, id INT, value INT); 
INSERT @Table VALUES ('01/01/2005',50000,5); 
INSERT @Table VALUES ('01/01/2006',50000,6); 
INSERT @Table VALUES ('01/01/2007',50000,7); 
INSERT @Table VALUES ('01/01/2005',50001,8); 
INSERT @Table VALUES ('01/01/2006',50001,9); 
INSERT @Table VALUES ('01/01/2007',50001,10); 

-- XML Query 
-- the outer query groups by date, ensuring each date only shows up once 
SELECT 
    [date] AS '@date', 
    (
     -- The inner query selects all Ids for each date found in the outer query 
     SELECT id as '@dealId', 
       value as '@value' 
     FROM @Table B 
     WHERE B.date=A.date -- join on date from outer query 
     FOR XML PATH ('Id'), TYPE 
    ) 
FROM @Table A 
GROUP BY date 
FOR XML PATH ('Date'); 

-- Produces:  
<Date date="2005-01-01"> 
    <Id dealId="50000" value="5"/> 
    <Id dealId="50001" value="8"/> 
</Date> 
<Date date="2006-01-01"> 
    <Id dealId="50000" value="6"/> 
    <Id dealId="50001" value="9"/> 
</Date> 
<Date date="2007-01-01"> 
    <Id dealId="50000" value="7"/> 
    <Id dealId="50001" value="10"/> 
</Date> 
+0

感謝您的幫助。it worked – andy

+0

如果您覺得此答案已解決您的問題,請點擊綠色複選標記將其標記爲「已接受」。 – laylarenee

0

通常情況下,如果我需要這樣一個簡單的XML轉換,我使用for xml raw

select 
    t1.[date], 
    (
     select 
      t2.[Id] as dealId, t2.[Value] 
     from Table1 as t2 
     where t2.[date] = t1.[date] 
     for xml raw('Id'), type 
    ) 
from Table1 as t1 
group by t1.[date] 
for xml raw('Date') 

---------------------- 
<Date date="2005-01-01"> 
    <Id dealId="50000" Value="5"/> 
    <Id dealId="50001" Value="8"/> 
</Date> 
<Date date="2006-01-01"> 
    <Id dealId="50000" Value="6"/> 
    <Id dealId="50001" Value="9"/> 
</Date> 
<Date date="2007-01-01"> 
    <Id dealId="50000" Value="7"/> 
    <Id dealId="50001" Value="10"/> 
</Date> 

自己嘗試一下在sql fiddle demo

一些注意事項:

  • 您不必在列名中使用@,因爲默認情況下for xml raw是以屬性爲中心的。
  • 子查詢這裏有必要,因爲你想要嵌套的xml,現在它是獲得它的唯一方法。
  • 您還必須在子查詢中使用type修飾符來獲取內部數據爲xml。
+0

感謝您的幫助 – andy