简单的叙述下SQL中行列转换的小知识!
行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法,
可能网上已经有很多类似的方法了,有的比我的可能会更好,就当我记录一下自己的学习经历吧。这里我们列举一个关于股票的每日入账出账做一个统计然后整理数据,虽然例子可能不太合理,
但是不要太执着于这些细节,能说明问题就好,傻笑ing。。。。。
1 列转行:按照某一列分组,将另一列作为行时列名可数,不变。
什么意思呢?话说多了反而不懂,放两张图以表敬意。


很简单的做法,就是想统计一下一天的买入卖出情况,实现起来也很简单,因为操作这一列就两种行为,转换起来也非常简单,代码如下
SELECT 日期 ,
SUM(CASE 操作 WHEN '买入' THEN 交易额 ELSE 0 END ) 买入,
SUM(CASE 操作 WHEN '卖出' THEN 交易额 ELSE 0 END ) 卖出
FROM TabName
GROUP BY 日期
其实就是对case when then else的使用,也没有什么特别的技巧,非要说运用了什么思想的话就是采用了两次分组的思想吧。第一次分组是按日期分组,第二次则是按操作
来进行分组。如何你想将买入和卖出操作合并的话,就要利用一个函数,group_concat,从单词的意思就可以看出来,就是组的拼接(英语太渣,不要介意),得到的效果如下

mysql代码如下:
select
日期, group_concat(日期,交易额) as 统计from TabName
group by Date
sqlserver代码如下:
select 日期,
CONCAT('买入:',SUM(CASE 操作 WHEN '买入' THEN 交易额 ELSE 0 END ) ,'卖出:',SUM(CASE 操作 WHEN '卖出' THEN 交易额 ELSE 0 END )) as 统计
from TabName
group by 日期
对此我只想说一句,微软mmp,你就不能学一下腾讯,借鉴借鉴,傻笑ing!
2 同样是列转行,但是如果作为行的列并不可数,例如本例中的日期,那么又应该怎么做呢?
现实真残酷,当时做到这一步真的不知道怎么办,因为日期并不知道有多少(并不能因为我这里列出了三个就默认为三个,毕竟以后还不知道会有什么数据,所以我们并不能宽泛的讨论)
其实想想当时也真傻,不知道有多少个就统计一下呗,自己创建一个函数将所有的不同的日期统计下来不就好了。思路清晰了,接下来就开工。
首先创建一个临时表,因为我每天的操作是重复的,所以我要先统计一下
select 操作,日期,sum(交易额) as 交易额
into #temp
from TabName
group by 操作,日期

接下来就是单纯的将日期这一列变为行了,这里我就采用pivot(关于pivot的介绍估计网上一大堆了,我就不叙述了,不理解的可以留言)

我的心好累,总算有结果了,接下来放代码

我只能说一句,不容易啊,首先用一个临时表将所有的不重复的日期找出来然后放到@date中,再将每日重复的买入卖出做一个统计,最后再
利用pivot进行行和列的翻转。这里必须要要注意一点,pivot所识别的列名必须是带有'[]'这俩中括号,所以我这里采用了quotename函数来加括号,
然后再利用substring进行切割多余的字母。
有啥更好的方法希望大佬们给点意见,如果方法重复了也希望不要喷我,互相学习吧,我只是菜鸟!
简单的叙述下SQL中行列转换的小知识!的更多相关文章
- SQL中行列转换Pivot
--建表 ),课程 ),分数 int) --插入数据 ) ) ) ) ) ) 1.静态行转列(确定有哪些列) select 姓名, end)语文, end)数学, end)物理 from tb gro ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- 在Sqlserver下巧用行列转换日期的数据统计
在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...
- PL/SQL 实现行列转换
这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...
- SQL中DateTime转换成Varchar样式
SQL中DateTime转换成Varchar样式语句及查询结果:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect ...
- MySQL中行列转换的SQL技巧
行列转换常见场景 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列 ...
- Sql实现行列转换
从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据.今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据. ...
- SQL Server 行列转换
/* 标题:普通行列转换(version 2.0) 作者:范中磊 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql ...
- Sql的行列转换
创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...
随机推荐
- Android 获取浏览器当前分享页面的截屏
Android 获取浏览器当前分享页面的截屏 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/BrowserScreenShotActivity 文中 ...
- Brackets 前端编辑器试用
Brackets编辑器介绍 "一个现代的,开源的,了解网页设计的编辑器"这是官方的宣传语.也就是说它适用于网页开发,包含了许多亮点功能:实时预览(Live Preview).内联编 ...
- Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介
很久之前就打算开始写一下自己的技术博客了,实在抽不出时间所以计划一直搁置了,最近项目进度渐渐缓了下来,不那么忙了,也因此开始筹备自己的博客.说到这次博客的主角,也是无心插柳找到的,来源于两年前自己写的 ...
- 每天一个Linux命令(17)--whereis命令
whereis 命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返所有信息. 和find相比,whereis查找的速度非 ...
- mybatis系列笔记(1)---mybatis入门
mybatis入门 MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...
- JavaScript中的文档模式和严格模式
JavaScript中的文档模式和严格模式 语法模式有普通模式和严格模式两种 普通模式:正常的JavaScript语法拼写以及代码编写(相对于严格模式存在着语法上的不严谨),尽可能的识别错误以及不规范 ...
- Spark_总结四
Spark_总结四 1.Spark SQL Spark SQL 和 Hive on Spark 两者的区别? spark on hive:hive只是作为元数据存储的角色,解析 ...
- sass、less、stylus的安装及使用
一.什么是CSS预处器 CSS预处理器定义了一种新的语言,其基本思想是,用一种专门的编程语言,为CSS增加了一些编程的特性,将CSS作为目标生成文件,然后开发者就 只要使用这种语言进行编码工作.通俗的 ...
- #include<bits/stdc++.h>
在听学长讲课时看到了#include<bits/stdc++.h>这个头文件,瞬间懵逼辣,百度后了解了 #include<bits/stdc++.h>,包含了C++的所有头文件 ...
- JavaScript高级程序设计(学习)
文档模式是:混杂模式和标准模式. 若在文档开始处没有文档类型声明,则浏览器就会开启混杂模式.这种模式在不同的浏览器下行为差异非常大,如果不使用某些hack技术,跨浏览器的行为根本就没有一致性可言. 局 ...