SqlServer数据库怎么实现行转列的sql语句

SqlServer数据库怎么实现行转列的sql语句,第1张

PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现

PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 )

SQL2008 中可以直接使用

完整语法:

table_source

PIVOT(

聚合函数(value_column)

FOR pivot_column

IN(<column_list>)

)

View Code

UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

完整语法:

table_source

UNPIVOT(

value_column

FOR pivot_column

IN(<column_list>)

)

方法/步骤

首先我们建立一张表,名为RToC,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示。

我们往表中加入数据,分别添加小明与小花的语文和数学成绩,如图所示。

接下来,我们要进行行列转换,列应该是name,语文,数学。我们首先要考虑是如何得到列名,我们可以通过分组得到课程名称。如图所示,我们通过分组语句,从查询结果我们可以看出课程名的拼接字符串。

接下来,关键的行转列的函数pivot出场了,通过这个函数我们把分数填充到转换的列语文、数学的列值。

我们运行后,可以得到行转列的结果,如下图所示。

通过以上几个步骤,我们就可以轻松的实现行列转换了。同样,我们如果要把列转换成行, 应该怎么做呢?同样我们可以采用unpivot函数轻松实现。

没有环境,试试下面语句可否实现(oracle):

select Customer.CustomerId,

Customer.CustomerName

wm.concat(Phone.PhoneNumber)

from Customer left join

(

select CustomerPhone.CustomerId,

Phone.PhoneNumber

from CustomerPhone inner join Phone on CustomerPhone.PhoneId=Phone.PhoneId

order by CustomerPhone.CustomerId

)Phone on Customer.CustomerId=Phone.CustomerId


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9568031.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存