行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法,

可能网上已经有很多类似的方法了,有的比我的可能会更好,就当我记录一下自己的学习经历吧。这里我们列举一个关于股票的每日入账出账做一个统计然后整理数据,虽然例子可能不太合理,

但是不要太执着于这些细节,能说明问题就好,傻笑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中行列转换的小知识!的更多相关文章

  1. SQL中行列转换Pivot

    --建表 ),课程 ),分数 int) --插入数据 ) ) ) ) ) ) 1.静态行转列(确定有哪些列) select 姓名, end)语文, end)数学, end)物理 from tb gro ...

  2. SQL Server中行列转换 Pivot UnPivot

    SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...

  3. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

  4. PL/SQL 实现行列转换

    这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...

  5. SQL中DateTime转换成Varchar样式

    SQL中DateTime转换成Varchar样式语句及查询结果:Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AMSelect ...

  6. MySQL中行列转换的SQL技巧

    行列转换常见场景 由于很多业务表因为历史原因或者性能原因,都使用了违反第一范式的设计模式.即同一个列中存储了多个属性值(具体结构见下表). 这种模式下,应用常常需要将这个列依据分隔符进行分割,并得到列 ...

  7. Sql实现行列转换

    从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据.今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据. ...

  8. SQL Server 行列转换

    /* 标题:普通行列转换(version 2.0) 作者:范中磊 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql ...

  9. Sql的行列转换

    创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...

随机推荐

  1. Baidu图表插件--Eharts使用(柱状图)

    官网链接:http://echarts.baidu.com/index.html 官网的demo,api都很详细:我就分享下我的学习步骤 首先定义一个显示图标的区域: <div id=" ...

  2. ConOS安装mysql5.7 及简单配置

    安装 保证你的用户有权限 安装  没有 切换 root su root  (su的意思:swich user) # rpm -ivh http://dev.mysql.com/get/mysql57- ...

  3. java 解析json

    例<解析评论> //post方式请求 String url=“http://product.dangdang.com/comment/comment.php?product_id=6056 ...

  4. CHM文件无法打开的解决方法

    转载请注明来自:http://www.yaosansi.com原文地址:http://www.yaosansi.com/post/cannot_open_chm_file.html 目录:一.正确操作 ...

  5. JS高级程序设计学习笔记——继承

    我们知道,在OO语言中,继承可分为接口继承和实现继承.而ECMAScript的函数没有签名,不能实现“接口继承”,只能通过原型链实现“实现继承”. 在学习了各种继承模式之后,简单总结一下各种继承模式的 ...

  6. [编织消息框架][rpc]使用篇

    rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服务,传相应参数,返回内容就可以 而提供者根据调用相应服务同参数,工作处理后响应内容即可 根据他们的关系可以用JAVA 接口同实现类 ...

  7. oracle 用系统用户以SYSDBA身份登陆

    最近发现很多人问我 这么直接用系统OS用户 登陆 oracle : 1.首先通过用管理身份打开DOS命令窗口: 然后使用命令: sqlplus / as sysdba 即可: 其实这个命令和用sys用 ...

  8. 小红帽5.9 配置静态IP上网问题

    本来无一物,何处染尘埃. DHCP连得好好的,手痒试下STATIC,静态IP 首先进入/etc/sysconfig/network-scripts/ifcfg-eth0, 写入各种参数: BOOTPR ...

  9. ci公共模型类

    我们都知道,操作数据库的方法都写在模型中.但是一般情况下,一张表往往至少对应4个操作,也就是所谓crud.那么如果20张表,所对应的模型方法,就达到了80个,重复的操作显然这已经是一个体力活儿. 那么 ...

  10. Android HelloChart Demo

    这几天,要做一个图标的统计,自己去网上查了下,现在用的比较多的有三种,AChartEngine 是Google的一个开源图表库 这种我最开始就去导demo去了解他,不过里面是是英文,不好研究.我就放弃 ...