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=‘张三‘ FOR XML PATH(‘‘)),1,1,‘‘) ‘科目‘
from
t_score
group by name

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

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

时间: 2024-11-06 19:26:01

sql server 横向转丛向及FOR XML PATH使用的相关文章

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 1 -使用FOR XML返回XML结果集 XML 介绍 <CustomersOrders> <Customer custid="1" companyname="Customer NRZBB"> <Order orderid="10692" orderdate="2007-10-03T00:00:00&

Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据

原文:Querying Microsoft SQL Server 2012 读书笔记:查询和管理XML数据 2 -使用XQuery 查询XML数据 XQuery 是一个浏览/返回XML实例的标准语言. 它比老的只能简单处理节点的XPath表达式更丰富. 你可以同XPath一样使用.或是遍历所有节点,塑造XML实例的返回等. 作为一个查询语言, 你需要一个查询处理引擎. SQL Server 数据库通过XML数据类型方法的T-SQL 语句来处理XQuery. SQL Server 并不支持所有的X

Sql Server将一列字段拼接成字符串方法

最近在项目中遇到个问题,需要将表中某列字段合并成字符串输出,如果直接通过代码全部读取出来,再遍历进行拼接显然不是最好的方法,所以想着能否在数据读取的时候直接拼接好返回,网上搜了可通过for xml来实现. 首先,准备好需要的数据,脚本如下: if exists (select * from sysObjects where id=object_id('Student')) drop table Student go create table Student ( Id int, Name varc

十步优化SQL Server中的数据访问(转载)

原文地址:http://tech.it168.com/a2009/1125/814/000000814758.shtml 故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因. 经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表

SQL Server Reporting Services 自定义数据处理扩展DPE(Data Processing Extension)

最近在做SSRS项目时,遇到这么一个情形:该项目有多个数据库,每个数据库都在不同的服务器,但每个数据库所拥有的数据库对象(table/view/SPs/functions)都是一模一样的,后来结合网络上众多的资源找到了解决方案,即Data Processing Extensio(DPE).所谓DPE,直白地说就是开发自己的DLL去扩展SSRS的数据源,具体的操作如下所示: 1. 新建类库项目,并引入以下两个DLL: C:\Program Files\Microsoft SQL Server\MS

(轉載)sql server xml字段的操作

原文轉自:http://blog.csdn.net/hliq5399/article/details/8315373 今天用到sql server 的xml字段,首先这个项目中的xml字段都存为了ntext字段,所以第一个操作 ntext 转化为 xml 以下摘自 http://blog.darkthread.net/blogs/darkthreadtw/archive/2008/09/18/sql2005-nvarchar-to-xml.aspx XmlString是一個NText欄位,裡面放

[译]流言终结者 —— SQL Server 是Sybase的产品而不是微软的

http://www.cnblogs.com/xxxtech/archive/2011/12/30/2307859.html by Euan Garden 这些年来我听说过关于这个流言的许多版本,其中最有趣的要数是“微软来不及去混淆购买来的Sybase代码,所以SQL Server其实还是Sybase的产品”. 首先让我们来回顾一下历史.1987年,微软和Sybase公司展开了合作,共同建立和销售基于Sybase DataServer的数据库管理系统.Sybase享有SQL Server在Uni

为sql server 增加 parseJSON 和 ToJSON 函数

在SqlServer中增加Json处理的方法 Sql Server 存储非结构话数据可以使用xml类型,使用xpath方式查询,以前写过一篇随笔:Sql Server xml 类型字段的增删改查 除了xml类型也可以使用文本类型(char.vchar等)存储json格式的数据,如何在sql语句中解析json数据,这里有一篇博客 [转]在SqlServer 中解析JSON数据,它的来源是Consuming JSON Strings in SQL Server 针对json解析需要一个自定义类型Hi

SQL Server索引语法 &lt;第四篇&gt;

从CREATE开始 通过显式的CREATE INDEX命令 在创建约束时作为隐含的对象 随约束创建的隐含索引 当向表中添加如下两种约束之一时,就会创建隐含索引. 主键约束(聚集索引) 唯一约束(唯一索引) 一.CREATE INDEX语法 CREATE INDEX语句所做的事情与其听上去一样-用于在指定表或视图上基于声明的列创建索引: CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED] INDEX <index name> ON <table or vi