数据库查询XML结构,FOR XML PATH 语句的应用


/*
数据库查询XML结构,FOR XML PATH 语句的应用

*/

FOR XML PATH 语句的应用:

CREATE  TABLE TempTable(UserID int , UserName nvarchar(50));
insert into TempTable (UserID,UserName) values (1,'a')
insert into TempTable (UserID,UserName) values (2,'b')

select UserID,UserName from TempTable FOR XML PATH
-----运行这段脚本,将生成如下结果:

<row>
<UserID>1</UserID>
<UserName>a</UserName>
</row>
<row>
<UserID>2</UserID>
<UserName>b</UserName>
</row>
----大家可以看到两行数据生成了两个节点,修改一下PATH的参数:

select UserID,UserName from TempTable FOR XML PATH('lzy')
----再次运行上述脚本,将生成如下的结果:

<lzy>
<UserID>1</UserID>
<UserName>a</UserName>
</lzy>
<lzy>
<UserID>2</UserID>
<UserName>b</UserName>
</lzy>
----可以看到节点变成,其实PATH() 括号内的参数是控制节点名称的,这样的话大家可以看一下如果是空字符串(不是没有参数)会是什么结果?

select UserID,UserName from TempTable FOR XML PATH('')
----执行上面这段脚本将生成结果:

<UserID>1</UserID>
<UserName>a</UserName>
<UserID>2</UserID>
<UserName>b</UserName>
---这样就不显示上级节点了,
---大家知道在 PATH 模式中,列名或列别名被作为 XPath 表达式来处理,
---也就是说,是列的名字,这样大胆试验一下不给指定列名和别名会是怎么样?


select cast(userid as varchar) +','+ username from TempTable for xml path('')
select CAST(UserID AS varchar) + '',UserName + '' from TempTable FOR XML PATH('')
---运行上面这句将生成结果

----1a2b

----所有数据都生成一行,而且还没有连接字符,这样的数据可能对大家没有用处,还可以再变化一下:

select CAST(UserID AS varchar) + ',',UserName + '',';' from TempTable FOR XML PATH('')
select CAST(userid as varchar) +',' +username +';' from TempTable for xml path('')
----生成结果

1,a;2,b;

----大家现在明白了吧,可以通过控制参数来生成自己想要的结果,例如:

select '{' + CAST(UserID AS varchar) + ',','"' +UserName + '"','}' from TempTable FOR XML PATH('')
生成结果

{1,"a"}{2,"b"}

----还可以生成其他格式,大家可以根据自己需要的格式进行组合。

----下面是一个数据统计的应用,希望大家可以通过下面的实例想到更多的应用


if OBJECT_ID('t1')is not null drop table t1
create  table t1(UserID int , UserName nvarchar(50),CityName nvarchar(50))
insert into t1 (UserID,UserName,CityName) values (1,'a','上海')
insert into t1 (UserID,UserName,CityName) values (2,'b','北京')
insert into t1 (UserID,UserName,CityName) values (3,'c','上海')
insert into t1 (UserID,UserName,CityName) values (4,'d','北京')
insert into t1 (UserID,UserName,CityName) values (5,'e','上海')
---需要生成如下:
/*
北京 b,d
上海 a,c,e
*/
select * from t1 order by CityName


select cityname,substring(userlist,1,LEN(userlist)-1)as userlist
from  (
select distinct  cityname,
(
select  username+',' from t1 where CityName=a.cityname for xml path('')
)as userlist
from t1 a
)b

 


SELECT B.CityName,LEFT(UserList,LEN(UserList)-1) FROM (
SELECT CityName,
    (SELECT UserName+',' FROM t1 WHERE CityName=A.CityName FOR XML PATH('')) AS UserList
FROM t1 A
GROUP BY CityName
) B

/*
----生成结果(每个城市的用户名)

北京 b,d
上海 a,c,e
 */
 
 
 
 
-----例子二
 
 ----
 
IF object_id('t1')IS NOT NULL DROP TABLE t1
Create table t1(eoID int,docID INT,handle VARCHAR(10))--- --eoID 办理单位ID,docID--办理文件ID handle--办理类型
INSERT INTO t1 
SELECT 1,100,'主办' UNION ALL
SELECT 3,100,'会办' UNION ALL
SELECT 2,102,'主办' UNION ALL
SELECT 1,102,'主办' UNION ALL
SELECT 1,103,'主办' UNION ALL
SELECT 3,103,'主办' UNION ALL
SELECT 3,104,'主办' UNION ALL
SELECT 1,104,'会办' UNION ALL
SELECT 2,104,'会办' UNION ALL
SELECT 1,105,'主办' UNION ALL
SELECT 3,105,'会办' UNION ALL
SELECT 2,105,'会办'


SELECT * FROM T1 ORDER BY eoID


---1
SELECT eoid,
       总数=COUNT(*),
       主办数=sum(CASE WHEN handle='主办' THEN 1 ELSE 0 END ),
       主办情况=stuff((select  cast(docID as varchar)+',' from t1 where eoid=a.eoID  and handle ='主办' for XML path('') ),1,1,''),
       会办数=SUM(case when handle ='会办' then 1 else 0 end ),
       会办情况=stuff((select CAST(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='会办' for XML  path('')),1,1,'')
from t1 a
group by eoid
 
 
 ---2
 select eoid,zongshu,SUBSTRING(zhqk,1,LEN(zhqk)-1),hbs,SUBSTRING (hbqk,1,LEN(hbqk)-1)
 from
 (
 SELECT eoid,
       zongshu=COUNT(*),
       zbs=sum(CASE WHEN handle='主办' THEN 1 ELSE 0 END ),
       zhqk=(select  cast(docID as varchar)+',' from t1 where eoid=a.eoID  and handle ='主办' for XML path('') ),
       hbs=SUM(case when handle ='会办' then 1 else 0 end ),
       hbqk=(select CAST(docID as varchar)+',' from t1 where eoid=a.eoID and handle ='会办' for XML  path(''))
from t1 a
group by eoid
)c
 
 
 
 /*
 select * from
 (
   select distinct  eoid,handle,
   ( 
  select cast(docid as varchar)+',' from t1  where eoid=a.eoID and handle ='主办' for  xml path('')
  )as docid
  from t1 a

  union all

   select distinct  eoid,handle,
   ( 
  select cast(docid as varchar)+',' from t1  where handle=a.handle and handle ='会办' for  xml path('')
  )as docid
  from t1 a
)c
where docid is not null
order by eoID
*/

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值