博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
按月统计订单数量报表SQL语句(CASE 和DECODE的使用)
阅读量:5274 次
发布时间:2019-06-14

本文共 2306 字,大约阅读时间需要 7 分钟。

本文主要是使用CASE 和DECODE实现按月统计订单数量,通过此示例希望能帮助读者理解CASE和DECODE在ORCALE中的使用。

1.使用CASE实现:

SELECT OPERATING_WAREHOUSE_CODE,SUM(M1) AS M1,SUM(M2) AS M2,SUM(M3) AS M3FROM (SELECT OPERATING_WAREHOUSE_CODE,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '02' THEN '1' ELSE '0' END AS M2,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '03' THEN '1' ELSE '0' END AS M3FROM OMS_ORDER_HEAD MWHERE M.ORDER_CREATION_DTE > TO_DATE('2012-1-1','YYYY-MM-DD') AND M.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD'))GROUP BY OPERATING_WAREHOUSE_CODEORDER BY OPERATING_WAREHOUSE_CODE

这是一条按月统计每个OPERATING_WAREHOUSE_CODE订单数量的SQL语句,统计2012年一到三月份每个OPERATING_WAREHOUSE_CODE的订单数量。

本文主要介绍下CASE WHEN  THEN   ELSE   END AS的使用。

文中:

CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1

这段SQL主要是把表OMS_ORDER_HEAD中订单创建时间为一月份的标记为”1”,并且这段代码增加了一列M1,同样M2和M3分别对应二月份和三月份,根据订单创建的时间其对应的月份M1,M2,M3列的值会被标记为1。

SELECT OPERATING_WAREHOUSE_CODE,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '01' THEN '1' ELSE '0' END AS M1,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '02' THEN '1' ELSE '0' END AS M2,CASE WHEN TO_CHAR(M.ORDER_CREATION_DTE,'mm') = '03' THEN '1' ELSE '0' END AS M3FROM OMS_ORDER_HEAD MWHERE M.ORDER_CREATION_DTE > TO_DATE('2012-1-1','YYYY-MM-DD') AND M.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD')

其中这段SQL执行的结果如图:

然后在此基础上再对M1(一月),M2(二月),M3(三月)对应的订单数量用SUM进行统计。

整条SQL语句的执行结果入下图:

 整条SQL语句用CASE WHEN  THEN   ELSE   END AS结合SUM很好的统计出2012年前三个月每个OPERATING_WAREHOUSE_CODE的订单数量。

2.使用DECODE实现

 当然我们同样可以通过使用ORACLE中的DECODE来实现同样的功能,DECODE的实现代码:

select OPERATING_WAREHOUSE_CODE,SUM(DECODE(TO_CHAR(OH.Order_Creation_Dte,'mm'),01,1,0)) as M1,SUM(DECODE(TO_CHAR(OH.ORDER_CREATION_DTE,'mm'),02,1,0)) AS M2,SUM(DECODE(TO_CHAR(OH.ORDER_CREATION_DTE,'mm'),03,1,0)) AS M3from OMS_ORDER_HEAD OHWHERE OH.ORDER_CREATION_DTE>TO_DATE('2012-1-1','YYYY-MM-DD') AND OH.ORDER_CREATION_DTE < TO_DATE('2012-4-1','YYYY-MM-DD')GROUP BY OPERATING_WAREHOUSE_CODEORDER BY OPERATING_WAREHOUSE_CODE
以上SQL可以达到上述CASE同样的效果。
在逻辑编程中,经常用到If – Then –Else 进行逻辑判断。在DECODE的语法中,实际上就是这样的逻辑处理过程。它的语法如下:
DECODE(value, if1, then1, if2,then2, if3,then3, . . . else )
不管是用CASE还是DECODE都可以达到同样的效果,在理解的基础上我们可以灵活使用DECODE和CASE的用法。

转载于:https://www.cnblogs.com/jeoleo/archive/2012/04/17/2453354.html

你可能感兴趣的文章
P1970 花匠
查看>>
java语言与java技术
查看>>
NOIP2016提高A组五校联考2总结
查看>>
iOS 项目的编译速度提高
查看>>
table中checkbox选择多行
查看>>
Magento开发文档(三):Magento控制器
查看>>
性能调优攻略
查看>>
ie6解决png图片透明问题
查看>>
瞬间的永恒
查看>>
2019-8-5 考试总结
查看>>
JS中实现字符串和数组的相互转化
查看>>
web service和ejb的区别
查看>>
Windows Azure Cloud Service (29) 在Windows Azure发送邮件(下)
查看>>
CS61A Efficiency 笔记
查看>>
ArcGIS Server Javascript 多图对比功能
查看>>
微信上传素材返回 '{"errcode":41005,"errmsg":"media data missing"}',php5.6返回
查看>>
div或者p标签单行和多行超出显示省略号
查看>>
Elasticsearch 滚动重启 必读
查看>>
Hadoop基本概念
查看>>
java.util.zip压缩打包文件总结一:压缩文件及文件下面的文件夹
查看>>