利用XML FOR PATH 合併分組信息

 最近做統計功能的時候經常需要用到合併分組內容,如果只根據分組統計數值用聚合函數就可以了,如果處理分組後的字符串列呢,我們就必須要自己寫函數處理了,比如有這樣的數據信息:
      
            

      現在要對上面數據進行分組,獲取統計結果:

            


      實現方式一:
                  


-- ================================================
--
 Description:合併分組內容
--
 Author:夏保華
--
 Date:2009-08-06
--
 ================================================
create   table   Employees(DepartmentName varchar(50),EmpoyeeName  varchar(20))   
insert into Employees   
select '開發部','小劉' union all
select '開發部','小王' union all
select '開發部','小張' union all
select '工程部','老吳' union all
select '工程部','老李' union all
select '市場部','大兵' union all
select '市場部','大黃' union all
select '市場部','大蝦' union all
select '市場部','大國'
go 

create function  Sum_ByGroup(@DepartmentName varchar(50))   
returns varchar(8000)   
as   
begin   
    
declare @ret varchar(8000)   
    
set   @ret  =  ''   
    
select  @ret  =  @ret+','+EmpoyeeName from Employees where DepartmentName = @DepartmentName   
    
set   @ret   =   stuff(@ret,1,1,'')   
    
return   @ret     
end   
go

select DepartmentName,dbo.Sum_ByGroup(DepartmentName) as EmployeesList from Employees
group by DepartmentName
go


      實現方式二:利用 T-SQL 技術生成 XML 的方法
      

select DepartmentName,stuff((select ','+EmpoyeeName from Employees where DepartmentName = e.DepartmentName for xml path('')),1,1,''as EmployeesList from Employees E
group by DepartmentName


      呵呵,這樣就是不是簡單多了,不用再寫一個函數去處理這麼麻煩了。     


      擴展:For XML Path
      1.在該 XML 中,生成的行集中的每個列值都包在元素中。由於 SELECT 子句未指定任何列名別名,因此生成的子元素名稱與 SELECT 子句中相應的列名相同。如果未對path指定任何信息,針對行集中的每一行,將添加一個 <row> 標記。
      
      SQL語句:

select DepartmentName,(select ''+EmpoyeeName from Employees where DepartmentName = e.DepartmentName for xml path) as EmployeesList from Employees E
group by DepartmentName


      如:
             

      2.您可以選擇指定行元素名稱,以覆蓋默認的 <row>。例如,以下查詢將針對行集中的每一行返回相應的 <Employee> 元素。
      
      SQL語句:

select DepartmentName,(select ''+EmpoyeeName from Employees where DepartmentName = e.DepartmentName for xml path('Employee')) as EmployeesList from Employees E
group by DepartmentName


      結果:
      
            

      3.如果指定零長度字符串,則將不生成包裝元素。
      結果:
      
             

      4.可以通過在 FOR XML 中指定 root 選項來添加單個頂級元素
      SQL語句:
      

select DepartmentName,(select ''+EmpoyeeName from Employees where DepartmentName = e.DepartmentName for xml path('Employee'),root('Root')) as EmployeesList from Employees E
group by DepartmentName


      結果:

      

 

http://www.cnblogs.com/huazai/archive/2009/08/07/1541453.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章