• zz数据库查询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
    */

  • 相关阅读:
    <爬虫实例> 8684公交网-太原公交线路信息
    <爬虫> requests模块
    爬虫四 selenium + phantomjs & Headless Chrome
    爬虫三 bs4&xpath&jsonpath
    爬虫二 cookie&正则
    爬虫一 发请求&定制请求&异常处理&配置代理
    抽屉页面设计
    HTML标签及其属性
    Python之路 day3 高阶函数
    Python之路 day3 递归函数
  • 原文地址:https://www.cnblogs.com/end/p/1805814.html
Copyright © 2020-2023  润新知