zoukankan      html  css  js  c++  java
  • 【SQL】多行转一列 FOR XML PATH

    CREATE TABLE TEST6
    (
    NAME VARCHAR(200),
    ENTRY_DATE DATE,
    COMPANY VARCHAR(200)
    )
    
    INSERT INTO TEST6 VALUES('王强','2008-1-1','电信');
    INSERT INTO TEST6 VALUES('王强','2009-1-1','移动');
    INSERT INTO TEST6 VALUES('王强','2010-1-1','联通');
    INSERT INTO TEST6 VALUES('李四','2008-1-1','电网');
    INSERT INTO TEST6 VALUES('李四','2009-1-1','财政局');
    INSERT INTO TEST6 VALUES('张三','2012-12-1','腾讯');
    INSERT INTO TEST6 VALUES('张三','2013-12-1','阿里');
    INSERT INTO TEST6 VALUES('张三','2014-12-1','美团');
    INSERT INTO TEST6 VALUES('张三','2015-12-1','饿了么');

    测试表结构如上:

    现在需要知道每个员工的任职次序

    此时就用到了  FOR XML PATH函数

    select COMPANY from TEST6 where NAME = '王强' for xml path('')

    查询结果:

    如果在path中给个参数

    select COMPANY from TEST6 where NAME = '王强' for xml path('node')

    查询结果:

    可以看出,原来的节点增加了Node的标签

    select COMPANY as myCom from TEST6 where NAME = '王强' for xml path('node')

     可以看出子节点的标签名也被改了

    那如果不想要xml格式的,也可以用以下方法代替

    SELECT '[ '+ COMPANY +' ]' FROM TEST6 where NAME = '王强' FOR XML PATH('')

    查询结果如下:

    最后拿出我们需要的结果

    SELECT B.Name,LEFT(StuList,LEN(StuList)-1) as hobby FROM (
    SELECT Name,
    (SELECT COMPANY+',' FROM TEST6 
      WHERE Name=A.Name 
      FOR XML PATH('')) AS StuList
    FROM TEST6 A 
    GROUP BY Name
    ) B

    查询结果

    参考自:https://www.cnblogs.com/yasuo2/p/6433697.html

    另外看到一篇:SQL Server 行转列,列转行。多行转成一列

  • 相关阅读:
    Ridis学习笔记
    VMware虚拟机安装教程
    Spring中获取Bean的几种方式
    jQuery中的常用事件
    乱码解决
    自动装配
    通配符用法
    Spring
    Spring mvc简单案例
    jdbctemplate
  • 原文地址:https://www.cnblogs.com/yhnet/p/12660567.html
Copyright © 2011-2022 走看看