iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >行转列之SQL SERVER PIVOT怎么用
  • 752
分享到

行转列之SQL SERVER PIVOT怎么用

2024-04-02 19:04:59 752人浏览 薄情痞子
摘要

这篇文章主要介绍行转列之SQL Server PIVOT怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某

这篇文章主要介绍行转列之SQL Server PIVOT怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表:

WEEK_INCOME(WEEK VARCHAR(10),INCOME DECIMAL)

我们先插入一些模拟数据:

INSERT INTO WEEK_INCOME 
SELECT '星期一',1000
UNION ALL
SELECT '星期二',2000
UNioN ALL
SELECT '星期三',3000
UNION ALL
SELECT '星期四',4000
UNION ALL
SELECT '星期五',5000
UNION ALL
SELECT '星期六',6000
UNION ALL
SELECT '星期日',7000

一般我们最经常使用的查询是查询一周中每天或某几天的收入,例如查询周一至周日全部的收入:

SELECT WEEK,INCOME FROM WEEK_INCOME

得到如下的查询结果集:

WEEK           INCOME
星期一           1000
星期二           2000
星期三           3000
星期四           4000
星期五           5000
星期六           6000
星期日           7000

但是在一些情况下(往往是某些报表中),我们希望在一行中显示周一至周日的收入,这时候查询结果集应该是这样的:

星期一   星期二   星期三   星期四   星期五   星期六   星期日
1000     2000     3000     4000     5000     6000     7000

这种情况下,sql查询语句可以这样写:

SELECT 
SUM(CASE WEEK WHEN '星期一' THEN INCOME END) AS [星期一],
SUM(CASE WEEK WHEN '星期二' THEN INCOME END) AS [星期二],
SUM(CASE WEEK WHEN '星期三' THEN INCOME END) AS [星期三],
SUM(CASE WEEK WHEN '星期四' THEN INCOME END) AS [星期四],
SUM(CASE WEEK WHEN '星期五' THEN INCOME END) AS [星期五],
SUM(CASE WEEK WHEN '星期六' THEN INCOME END) AS [星期六],
SUM(CASE WEEK WHEN '星期日' THEN INCOME END) AS [星期日]
FROM WEEK_INCOME

但是,在SQL SERVER 2005中提供了更为简便的方法,这就是"PIVOT"关系运算符。(相反的“列转行”是UNPIVOT),以下是使用PIVOT实现“行转列”的SQL语句

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]
FROM WEEK_INCOME
PIVOT
(
  SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])
)TBL

请参考MSDN中关于PIVOT的用法:

Http://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx

但是MSDN上的描述太过于规范严肃,我看了半天还没弄清楚怎样使用PIVOT,搞不清楚PIVOT里面的语法的含义。于是又Google了很多资料,以及通过上面提到的WEEK_INCOME表例子作了试验,最终搞清楚了其用法。在网上有篇博文解释的很好:http://rely1020.blog.ithome.com.tw/post/1606/39111,基本上我要写的就是参照该博文,再加上自己一点个人理解。

要理解PIVOT语法,就是要清楚微软为什么这样设计PIVOT,但我相信是现实需求催生设计思路,所以归根到底我们还是要弄清楚什么是“行转列”:

正常情况下的查询结果是这样:

星期一           1000
星期二           2000
星期三           3000
星期四           4000
星期五           5000
星期六           6000
星期日           7000

行转列后是这样:

星期一   星期二   星期三   星期四   星期五   星期六   星期日
1000    2000    3000    4000    5000    6000    7000

也就是说,行转列后,原来的某个列的值变做了列名,在这里就是原来WEEK列的值“星期一”,"星期二"..."星期日"边做了列名,而我们需要做的另一个工作就是计算这些列的值(这里的“计算”其实就是PIVOT里面的聚合函数(sum,avg等))

现在结合注释来分析一下PIVOT语法(在这之前最好看看我上面提到博文:http://rely1020.blog.ithome.com.tw/post/1606/39111,里面说到的PIVOT语法的三个步骤挺重要):

SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--这里是PIVOT第三步(选择行转列后的结果集的列)这里可以用“*”表示选择所有列,也可以只选择某些列(也就是某些天)
FROM WEEK_INCOME --这里是PIVOT第二步骤(准备原始的查询结果,因为PIVOT是对一个原始的查询结果集进行转换操作,所以先查询一个结果集出来)这里可以是一个select子查询,但为子查询时候要指定别名,否则语法错误
PIVOT
(
  SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])--这里是PIVOT第一步骤,也是核心的地方,进行行转列操作。聚合函数SUM表示你需要怎样处理转换后的列的值,是总和(sum),还是平均(avg)还是min,max等等。例如如果week_income表中有两条数据并且其week都是“星期一”,其中一条的income是1000,另一条income是500,那么在这里使用sum,行转列后“星期一”这个列的值当然是1500了。后面的for [week] in([星期一],[星期二]...)中 for [week]就是说将week列的值分别转换成一个个列,也就是“以值变列”。但是需要转换成列的值有可能有很多,我们只想取其中几个值转换成列,那么怎样取呢?就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只写“星期一”至“星期五”(注意,in里面是原来week列的值,"以值变列")。总的来说,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])这句的意思如果直译出来,就是说:将列[week]值为"星期一","星期二","星期三","星期四","星期五","星期六","星期日"分别转换成列,这些列的值取income的总和。
)TBL--别名一定要写

以上是我对PIVOT的理解,我尽所能表达出来。不过话说回来,个人的理解的方式也不同,就如我开始看了很多篇博文,都没有搞清楚PIVOT用法。结果还是硬的通过例子和别人的博文再加上思考才弄懂了,所以如果各位看了本篇之后仍不能理解,那很正常,配合例子再加上自己思考,慢慢的定能理解。

以上是“行转列之SQL SERVER PIVOT怎么用”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注编程网数据库频道!

您可能感兴趣的文档:

--结束END--

本文标题: 行转列之SQL SERVER PIVOT怎么用

本文链接: https://www.lsjlt.com/news/57730.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 行转列之SQL SERVER PIVOT怎么用
    这篇文章主要介绍行转列之SQL SERVER PIVOT怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某...
    99+
    2022-10-18
  • SQL Server中怎么使用Pivot和UnPivot实现行列转换
    这篇“SQL Server中怎么使用Pivot和UnPivot实现行列转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看...
    99+
    2023-06-28
  • SQL Server如何使用PIVOT与unPIVOT实现行列转换
    这篇“SQL Server如何使用PIVOT与unPIVOT实现行列转换”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这...
    99+
    2023-06-30
  • sql server如何通过pivot对数据进行行列转换
    脚本: create table #t ( [员工工号] nvarchar(50), [员工姓名] nvarchar(50), [月份] nvarchar(50), [工资] int ) in...
    99+
    2022-03-26
    sql server如何通过pivot对数据进行行列转换
  • sql server如何通过pivot对数据进行行列转换(进阶)
    脚本: declare @n int = 2 create table #t1 ( [月份] nvarchar(50), [业务员] nvarchar(50), [金额] int ) insert ...
    99+
    2016-08-13
    sql server如何通过pivot对数据进行行列转换(进阶)
  • Oracle中行列转换及pivot子句怎么用
    这篇文章将为大家详细讲解有关Oracle中行列转换及pivot子句怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、11g以前的行列转换方法创建测试表:create...
    99+
    2022-10-19
  • SQL Server基础之行数据转换为列数据
    准备工作 创建表 use [test1] go create table [dbo].[student]( [id] [int] identity(1,1) not null, [name...
    99+
    2022-10-18
  • SQL Server中怎么将行数据转换为列数据
    今天就跟大家聊聊有关SQL Server中怎么将行数据转换为列数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。准备工作创建表use [t...
    99+
    2022-10-18
  • Sql Server中怎么实现行数据转为列显示
    本篇内容主要讲解“Sql Server中怎么实现行数据转为列显示”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Sql Server中怎么实现行数据转为列显示”吧!场景:行数据...
    99+
    2023-06-30
  • 怎么在SQL中实现行转列和列转行
    怎么在SQL中实现行转列和列转行?针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。行列转换就是如下图所示两种展示形式的互相转换行转列假如我们有...
    99+
    2022-10-18
  • SQL Server序列SEQUENCE怎么使用
    这篇文章主要介绍了SQL Server序列SEQUENCE怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇SQL Server序列SEQUENCE怎么使用文章都会有所收获,下面我们一起...
    99+
    2023-06-30
  • 怎么使用SQL语句将行和列进行转换
    小编给大家分享一下怎么使用SQL语句将行和列进行转换,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!  如何使用SQL语句将行和列...
    99+
    2022-10-18
  • 怎么在SQL中使用Unpivot函数实现列转行
    本篇文章为大家展示了怎么在SQL中使用Unpivot函数实现列转行,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。创建数据 CREATE TABL...
    99+
    2022-10-18
  • SQL Server中怎么将一列的多行内容拼接成一行
    今天就跟大家聊聊有关SQL Server中怎么将一列的多行内容拼接成一行,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。昨天遇到一个SQL Serve...
    99+
    2022-10-18
  • SQL Server格式转换函数Cast怎么使用
    CAST函数在SQL Server中用于将一个数据类型转换为另一个数据类型。使用CAST函数的语法如下所示:CAST ( expre...
    99+
    2023-08-16
    SQL Server Cast
  • SQL Server格式转换函数Convert怎么使用
    SQL Server中的Convert函数用于将一个数据类型转换为另一个数据类型。语法如下:```sqlCONVERT ( data...
    99+
    2023-08-16
    SQL Server Convert
  • SQL Server中怎么计算列是否占用空间
    SQL Server中怎么计算列是否占用空间,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。今天看网上有个问题:SQL Server计算列是否占...
    99+
    2022-10-18
  • MySQL中行转列、列转行、连接字符串 concat、concat_ws、group_concat函数怎么用
    这篇文章主要介绍MySQL中行转列、列转行、连接字符串  concat、concat_ws、group_concat函数怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!...
    99+
    2022-10-18
  • SQL Server中怎么使用ISNULL执行空值判断查询
    SQL Server中怎么使用ISNULL执行空值判断查询,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。有如下查询:复制代码 ...
    99+
    2022-10-18
  • 怎么用listagg函数分组实现列转行
    小编给大家分享一下怎么用listagg函数分组实现列转行,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!listagg是Oracle 11.2中新增的函数,listagg可以对order b...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作