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语句,结果如下图:

 

posted @   大空白纸  阅读(1593)  评论(0编辑  收藏  举报
编辑推荐:
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示