• sql server 横向转丛向及FOR XML PATH使用


    1、开始数据结构如下:

    2、转为如下图:

    使用如下SQL语句:

    ---横向转丛向
    select 
        name '姓名',
        max(case when course='语文' then score end) as '语文',
        max(case when course='数学' then score end) as '数学',
        max(case when course='物理' then score end) as '物理'
    from
    t_score
    group by name

    3、以及转为如下图:

      (1)stuff函数

       STUFF 函数将字符串插入到另一个字符串中。 它从第一个字符串的开始位置删除指定长度的字符;然后将第二个字符串插入到第一个字符串的开始位置。

      

    select stuff(' world',1,0,'hello') --hello world

      (2)FOR XML PATH函数

          

    select *from t_score for xml path

    结果如下:

    <row>
      <id>1</id>
      <name>张三</name>
      <course>语文</course>
      <score>73</score>
    </row>
    <row>
      <id>2</id>
      <name>张三</name>
      <course>数学</course>
      <score>83</score>
    </row>
    <row>
      <id>3</id>
      <name>张三</name>
      <course>物理</course>
      <score>93</score>
    </row>
    <row>
      <id>4</id>
      <name>李四</name>
      <course>语文</course>
      <score>74</score>
    </row>
    <row>
      <id>5</id>
      <name>李四</name>
      <course>数学</course>
      <score>84</score>
    </row>
    <row>
      <id>6</id>
      <name>李四</name>
      <course>物理</course>
      <score>94</score>
    </row>
    select *from t_score for xml path('Mygrades')

    结果如下:

    <Mygrades>
      <id>1</id>
      <name>张三</name>
      <course>语文</course>
      <score>73</score>
    </Mygrades>
    <Mygrades>
      <id>2</id>
      <name>张三</name>
      <course>数学</course>
      <score>83</score>
    </Mygrades>
    <Mygrades>
      <id>3</id>
      <name>张三</name>
      <course>物理</course>
      <score>93</score>
    </Mygrades>
    <Mygrades>
      <id>4</id>
      <name>李四</name>
      <course>语文</course>
      <score>74</score>
    </Mygrades>
    <Mygrades>
      <id>5</id>
      <name>李四</name>
      <course>数学</course>
      <score>84</score>
    </Mygrades>
    <Mygrades>
      <id>6</id>
      <name>李四</name>
      <course>物理</course>
      <score>94</score>
    </Mygrades>
    select 
        name,
        course,
        score
    from t_score for xml path('Mygrades')

    结果如下:

    <Mygrades>
      <name>张三</name>
      <course>语文</course>
      <score>73</score>
    </Mygrades>
    <Mygrades>
      <name>张三</name>
      <course>数学</course>
      <score>83</score>
    </Mygrades>
    <Mygrades>
      <name>张三</name>
      <course>物理</course>
      <score>93</score>
    </Mygrades>
    <Mygrades>
      <name>李四</name>
      <course>语文</course>
      <score>74</score>
    </Mygrades>
    <Mygrades>
      <name>李四</name>
      <course>数学</course>
      <score>84</score>
    </Mygrades>
    <Mygrades>
      <name>李四</name>
      <course>物理</course>
      <score>94</score>
    </Mygrades>
    select
        course+';'
    from t_score where name='张三' for xml path('')
    --结果:语文;数学;物理;
    
    select
        '['+course+']'
    from t_score where name='张三' for xml path('')
    --结果:[语文][数学][物理];
    
    select
        '{'+course+'}'
    from t_score where name='张三' for xml path('')
    --结果:{语文}{数学}{物理};
    select 
        name '姓名',
        stuff((SELECT ';'+course FROM t_score where name=t.name FOR XML PATH('')),1,1,'') '科目'
    from 
    t_score t
    group by name

    使用上面SQL语句,结果如下图:

  • 相关阅读:
    黑洞数
    三态门最简单的描述方法
    数据选择器的符号和真值表
    RGB的同步信号
    奇场和偶场在信号格式上的差别
    CPOL与CPHA
    Pixel Replication
    HDMI传输中MCLK的获得
    Protel99 1:1打印PCB
    二极管和整流管
  • 原文地址:https://www.cnblogs.com/zoro-zero/p/3898894.html
Copyright © 2020-2023  润新知