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

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

但是不要太执着于这些细节,能说明问题就好,傻笑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. css控制图片与文字对齐

    文字旁边搭配图片时,发现图片比文字靠上,原来默认的情况是图片顶对齐而文字底对齐,通过设置css属性可以使得图片与文字对齐. 设置各对象的vertical-align属性,属性说明:baseline-将 ...

  2. 内存管理 (C++)

    转:http://hi.baidu.com/%D0%A1%B0%FC%D7%D349/blog/item/de1a8e4fa5eeafc3d0c86a68.html1.进程地址空间    Window ...

  3. C语言程序_管理系统

    #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 3 #define LEN ...

  4. 浏览器兼容汇总(css+js)

      JavaScript 1. HTML对象获取问题 FireFox:document.getElementById("idName");ie:document.idname或者d ...

  5. burp插件开发

    最近这几天在写burp的插件,有一些写burp插件的流程和误区想跟大家分享一下: 第一步,打开burpsuit,打开extender页面,并将burp中自带的api代码导出,方便后续的代码开发: 第二 ...

  6. laravel中的Database Notifications

    创建Post and  User模型 php artisan make:model Post php artisan make:model User 创建posts and  users 表文件 ph ...

  7. Nginx支持Socket转发过程详解

    序言 一网友在群中问,nginx支持socket转发吗? 实话说,我没做过socket转发,但是我知道socket跟http一样都是通过tcp或者udp通信的,我猜测啦一下nginx应该支持吧,然后又 ...

  8. hibernate jar包介绍

    Hibernate3.jar            这个是hibernate最主要的jar包 ant-1.63.jar      Ant 的核心包,在构建Hibernate 时会用到 antlr-2. ...

  9. JS邮箱验证-正则验证

    <form act="">输入:<input type="text" name="qc" id="qc" ...

  10. 对volatile关键字的理解

    本文是基于对 http://www.cnblogs.com/aigongsi/archive/2012/04/01/2429166.html 这篇文档的理解 volatile 用volatile修饰的 ...