首页 > 代码库 > sql server 横向转丛向及FOR XML PATH使用

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 物理fromt_scoregroup 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,    scorefrom 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=张三 FOR XML PATH(‘‘)),1,1,‘‘) 科目from t_scoregroup by name

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