一,案例问题描述:

某销售系统中,注册的用户会在随后的月份中购物下单,需要按月统计注册的用户中各个月下单的金额。源数据表如下:

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动态长度行列转置的更多相关文章

  1. SQL Server中行列转置方法

    PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P ...

  2. sql server多重行列转置的优化

    将表1转化成表2: 表1 表2 得到表2的结果,需要经过多次pivot转换,再经union连接到一起,代码如下: ] from ( select 'a' as type, * from Table_1 ...

  3. 使用SQL SERVER PIVOT实现行列转置

    一般我们在使用SQL语句实现行列转置时候,最常用的方法无外乎就是 case语句来实现,但是如果需要需要转置的列太多,那么case起来语句就无限庞大,十分不方便,sql server中的PIVOT就可以 ...

  4. 简化实现动态行列转置的SQL

    动态行列转换的计算在实际业务中非经常见,网上各类技术论坛上都有讨论,比方以下这些问题: http://www.iteye.com/problems/87788 http://bbs.csdn.net/ ...

  5. 动态SQL字符长度超过8000

    动态SQL字符长度超过8000,我记得SQL SERVER 2008中用SP_EXECUTESQL打破了这个限制. 平常用动态SQL,可能都会用EXEC(),但是有限制,就是8000字符串长度.自从S ...

  6. HAWQ中的行列转置

    行列转置是ETL或报表系统中的常见需求,HAWQ提供的内建函数和过程语言编程功能,使行列转置操作的实现变得更为简单. 一.行转列 1. 固定列数的行转列 原始数据如下: test=# select * ...

  7. SQL Server中行列转换 Pivot UnPivot

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

  8. Excel 行列转置 解决竖向拉,字母跟着递增的问题

    今天工作中遇到需要将Excel行列转置涉及到的数据单元格一共几千个 查询网上说可以通过复制粘贴单元格,粘贴选项中转置一项实现,但是所涉及的sheet页中,数据格式和单元格格式各不一样,转置失败! 怎么 ...

  9. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

随机推荐

  1. js 如何判断数组元素是否存在重复项

    1.如何判断数组元素是否存在重复项 1)定义测试数组 //定义测试的数组(1个没有重复元素,1个有重复元素) var arr1 = new Array("111","33 ...

  2. Photos_2017 China MVP Community Connection

  3. Selenium自动化获取Http报文信息并判断当前API状态

    public int loadingFinishedCount(WebDriver driver){ LogEntries logs = driver.manage().logs().get(&quo ...

  4. cvte春招测试面试记录

    cvte春招测试面试记录,挂在了综合面试(hr面)...尽量回忆面试的问题(可能不完全). 技术面一面: 1.自我介绍 2.根据实习项目问,智能客服怎么测正确率之类的. 3.测试人脸解锁 4.测试微信 ...

  5. IE浏览器下flex布局的bug

    原文地址:gitub上的Flexbugs list,可以看到Flex布局在IE糟糕表现的详细描述. 2. Column flex items set to align-items:center ove ...

  6. 使用引用计数和copy-on_write实现String类

    本文写于2017-01-18,从老账号迁移到本账号,原文地址:https://www.cnblogs.com/huangweiyang/p/6295420.html 这算是我开始复习的内容吧,关于st ...

  7. java IO性能对比----read文件

    本次对比内容为:(jdk1.8) fileInputStream:最基本的文件读取(带自己声明的缓冲区) dataInputStream:字节读取,在<java编程思想>一书中描述为使用最 ...

  8. Windows下Caffe实现图像分类

    前言:最近参加百度点石大赛,完成商家招牌的分类和检测,把实验过程简单记录下来,具体步骤如下. 环境配置:windows下的visual studio2013和caffe(cpu版本)环境搭建请看我另一 ...

  9. 2—ARM中的异常中断

    ARM体系中的3种控制程序执行的方式 正常执行过程中,每执行1条ARM指令,PC的值加4个字节:每执行1条Thumb指令,PC的值加2个字节.整个过程按照顺序执行. 通过跳转指令,调到特定的地址开始执 ...

  10. 软工个人作业4——Alpha阶段个人总结

    一.个人总结 1.在alpha 结束之后, 每位同学写一篇个人博客, 总结自己的alpha 过程: 经过本次alpha阶段的冲刺,首先学到了很多,收获了很多,同时也蛮辛苦的.其实我觉得作为组员我有很认 ...