SQL动态长度行列转置
一,案例问题描述:
某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额。源数据表如下:
FM::注册月份,CM: 下单月份, AMT:下单金额

期望得到如下统计结果:

在该案列中,随着时间变化,下单月份的值是不断变化的,因此在行列转置中,需要能够满足其动态变化的要求:
二,准备测试数据
CREATE TABLE TEST_PIVOT_DYNAMIC_COLUMN
(
FM DATE,
CM DATE,
AMT NUMBER
)
; INSERT INTO TEST_PIVOT_DYNAMIC_COLUMN
SELECT ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -3), ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -2), 10 FROM DUAL
; INSERT INTO TEST_PIVOT_DYNAMIC_COLUMN
SELECT ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -1), ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -1), 1 FROM DUAL
;
INSERT INTO TEST_PIVOT_DYNAMIC_COLUMN
SELECT ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), -1), ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), 0), 2 FROM DUAL
;
INSERT INTO TEST_PIVOT_DYNAMIC_COLUMN
SELECT ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), 0), ADD_MONTHS(TRUNC(CURRENT_DATE, 'MM'), 0), 2 FROM DUAL
; SELECT *
FROM TEST_PIVOT_DYNAMIC_COLUMN
;
三,核心转置代码
CREATE OR REPLACE PROCEDURE SP_PIVOT_DYNAMIC_COLUMN
IS
V_COLUMN VARCHAR2(1000);
BEGIN --get the distinct value of all the month, and concatenate them together
SELECT LISTAGG(FM,',') WITHIN GROUP (ORDER BY FM) INTO V_COLUMN
FROM (
SELECT DISTINCT 'TO_DATE(''' || TO_CHAR(FM, 'YYYY/MM/DD') || ''',''YYYY/MM/DD'') AS M' || TO_CHAR(FM, 'YYYYMM') AS FM
FROM TEST_PIVOT_DYNAMIC_COLUMN
)
; EXECUTE IMMEDIATE
'CREATE OR REPLACE VIEW TEST_PIVOT_DYNAMIC_COLUMN_PV AS
SELECT * FROM TEST_PIVOT_DYNAMIC_COLUMN
PIVOT
(
SUM(AMT)
for CM
in ('
|| V_COLUMN ||
')
)
ORDER BY FM
'; END SP_PIVOT_DYNAMIC_COLUMN;
check the result:
SELECT *
FROM TEST_PIVOT_DYNAMIC_COLUMN
; CALL SP_PIVOT_DYNAMIC_COLUMN()
; SELECT * FROM TEST_PIVOT_DYNAMIC_COLUMN_PV
;
SQL动态长度行列转置的更多相关文章
- SQL Server中行列转置方法
PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...
- sql server多重行列转置的优化
将表1转化成表2: 表1 表2 得到表2的结果,需要经过多次pivot转换,再经union连接到一起,代码如下: ] from ( select 'a' as type, * from Table_1 ...
- 使用SQL SERVER PIVOT实现行列转置
一般我们在使用SQL语句实现行列转置时候,最常用的方法无外乎就是 case语句来实现,但是如果需要需要转置的列太多,那么case起来语句就无限庞大,十分不方便,sql server中的PIVOT就可以 ...
- 简化实现动态行列转置的SQL
动态行列转换的计算在实际业务中非经常见,网上各类技术论坛上都有讨论,比方以下这些问题: http://www.iteye.com/problems/87788 http://bbs.csdn.net/ ...
- 动态SQL字符长度超过8000
动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...
- HAWQ中的行列转置
行列转置是ETL或报表系统中的常见需求,HAWQ提供的内建函数和过程语言编程功能,使行列转置操作的实现变得更为简单. 一.行转列 1. 固定列数的行转列 原始数据如下: test=# select * ...
- SQL Server中行列转换 Pivot UnPivot
SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PI ...
- Excel 行列转置 解决竖向拉,字母跟着递增的问题
今天工作中遇到需要将Excel行列转置涉及到的数据单元格一共几千个 查询网上说可以通过复制粘贴单元格,粘贴选项中转置一项实现,但是所涉及的sheet页中,数据格式和单元格格式各不一样,转置失败! 怎么 ...
- 用powershell+excel行列转置三步走
本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...
随机推荐
- java中的多线程入门
进程:一个进程包括由操作系统分配的内存空间,包含一个或多个线程.一个线程不能独立的存在,它必须是进程的一部分.一个进程一直运行,直到所有的非守护线程都结束运行后才能结束. 而多线程的好处就是效率高,充 ...
- JVM工具jstat使用说明
输入:jstat -help得到以下帮助信息 Usage: jstat --help|-options jstat -<option> [-t] [-h<lines>] < ...
- vim 插件 -- taglist
taglist 插件是基于ctags生成的tags文件一个工具.主要是用来生成当前文件的结构.如:函数名.变量名结构.具体如下图: 下载 https://www.vim.org/scripts/scr ...
- 大数据之NBA
2017年NBA季后赛落幕后,网络上仍有大量关于NBA关键词的搜索. 这是近30天来,通过PC端和移动端搜索的趋势,可以看到有些日期的搜索指数是猛增的,因为NBA有大新闻爆出,比如8月23日,骑士与凯 ...
- RockerMQ实战之快速入门
文章目录 RocketMQ 是什么 专业术语 Producer Producer Group Consumer Consumer Group Topic Message Tag Broker Name ...
- MacOS 系统终端上传文件到 linux 服务器
使用scp: scp是secure copy的简写,用于在Linux下进行远程拷贝文件的命令,和它类似的命令有cp,不过cp只是在本机进行拷贝不能跨服务器,而且scp传输是加密的.可能会稍微影响一下速 ...
- react Hooks
useEffect 1.useEffect是didMount和didUpdate和willUnmount三个函数的集合 2.useEffec(fun):fun会在每次组件render之后执行,而fun ...
- 怎么获取红米6 Pro的root权限
红米6 Pro能有啥方法获得ROOT超级权限?做开发的人知道,android设备有ROOT超级权限,如果手机获得root相关权限,就能够实现更强大的功能,举例子,做开发的人部门的营销部门的妹子,使用一 ...
- linux安装mysql(shell一键安装)
1. 相关文件(install_mysql.sh.my.cnf.mysqld相关内容在文中最后面) 2. 将上面的文件上传到linux服务器某一目录下 3.给install_mysql.sh赋执行权限 ...
- 初学者如何迅速学习web前端开发
首先告诉你的是,零基础学习开始学习web前端肯定难,web前端的专业程度本身就不简单,学习这事本来就是一件非常煎熬的事情,人都不愿意学习,可是没办法,为了生存掌握一个技能,你必须学,如果你认真的对待, ...