拼接方法:   
     /// <summary>
/// 生成计算同比环比查询语句
/// table:表名称;statColumns:要统计的值字段;yearColumn:年份字段名;monthColumn:月份字段名;joinColumns:除年月外的连接条件
/// --上期无值或0本期有值不为0:1
/// --上期有值不为0本期无值或0:-1
/// --上期本期都无值或都为0:null
/// --上期本期都有值且都不为0:(本期-上期)/上期
/// </summary>
public string GenerateOracleStatSql(string table, string[] statColumns, string[] joinColumns, string yearColumn, string monthColumn)
{
if (string.IsNullOrEmpty(table) || statColumns == null || statColumns.Length == 0)
{
return null;
}
string mainTableName = "m"; //主表别名
string tbTableName = "t";//同比表别名
string hbTableName = "h";//环比表别名
StringBuilder sql = new StringBuilder();
//查询
sql.Append("select ");
//查询年月以外的字段
//查询年月
foreach (string column in joinColumns)
{
sql.AppendFormat("{0}.{1},", mainTableName, column);
}
sql.AppendFormat("{0}.{1},{0}.{2}", mainTableName, yearColumn, monthColumn);
//查询主表统计字段
foreach (string column in statColumns)
{
sql.AppendFormat(",{0}.{1}", mainTableName, column);
}
//查询同比,环比
foreach (string column in statColumns)
{
//同比
sql.AppendFormat(",decode(nvl({0}.{2}, 0),0,decode(nvl({1}.{2}, 0), 0, null, 1),decode(nvl({1}.{2}, 0),0,-1,({1}.{2} - {0}.{2}) / {0}.{2})) {2}_TB", tbTableName, mainTableName, column);
//环比
sql.AppendFormat(",decode(nvl({0}.{2}, 0),0,decode(nvl({1}.{2}, 0), 0, null, 1),decode(nvl({1}.{2}, 0),0,-1,({1}.{2} - {0}.{2}) / {0}.{2})) {2}_HB", hbTableName, mainTableName, column);
}
string tbwhere = "";
string hbwhere = "";
foreach (string column in joinColumns)
{
tbwhere += string.Format(" and {0}.{1} = {2}.{1}", mainTableName, column, tbTableName);
hbwhere += string.Format(" and {0}.{1} = {2}.{1}", mainTableName, column, hbTableName);
}
//要查询的表和连接条件
sql.AppendFormat(@" from {0} {1}
left join {0} {2}
on to_number({1}.{4}) = to_number({2}.{4}) + 1
and to_number({1}.{5}) = to_number({2}.{5}) {6}
left join {0} {3}
on to_number({1}.{4}) * 12 + to_number({1}.{5}) =
to_number({3}.{4}) * 12 + to_number({3}.{5}) + 1 {7}
order by to_number({1}.{4}), to_number({1}.{5})", table, mainTableName, tbTableName, hbTableName, yearColumn, monthColumn, tbwhere, hbwhere);
return sql.ToString();
}

调用:

string sql = GenerateOracleStatSql("TEST_STAT", new string[] { "TOT_WT" }, new string[] { "GOODS_NAME" }, "STAT_YEAR", "STAT_MONTH");

生成结果:

select m.GOODS_NAME,
m.STAT_YEAR,
m.STAT_MONTH,
m.TOT_WT,
decode(nvl(t.TOT_WT, 0),
0,
decode(nvl(m.TOT_WT, 0), 0, null, 1),
decode(nvl(m.TOT_WT, 0),
0,
-1,
(m.TOT_WT - t.TOT_WT) / t.TOT_WT)) TOT_WT_TB,
decode(nvl(h.TOT_WT, 0),
0,
decode(nvl(m.TOT_WT, 0), 0, null, 1),
decode(nvl(m.TOT_WT, 0),
0,
-1,
(m.TOT_WT - h.TOT_WT) / h.TOT_WT)) TOT_WT_HB
from TEST_STAT m
left join TEST_STAT t
on to_number(m.STAT_YEAR) = to_number(t.STAT_YEAR) + 1
and to_number(m.STAT_MONTH) = to_number(t.STAT_MONTH)
and m.GOODS_NAME = t.GOODS_NAME
left join TEST_STAT h
on to_number(m.STAT_YEAR) * 12 + to_number(m.STAT_MONTH) =
to_number(h.STAT_YEAR) * 12 + to_number(h.STAT_MONTH) + 1
and m.GOODS_NAME = h.GOODS_NAME
order by to_number(m.STAT_YEAR), to_number(m.STAT_MONTH)

oracle下拼同比环比查询sql方法的更多相关文章

  1. oracle下导出某用户所有表的方法

    oracle下导出某用户所有表的方法 scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/tiger@handso ...

  2. asp下实现多条件模糊查询SQL语句

    常写一个简单的模糊查询的SQL语句格式可以如下例: sql="select * from 表名 where 字段名 like ’%" & request.form(&quo ...

  3. oracle ebs中并发程序定义查询sql

    ---concurrent program define SELECT FCPV.CONCURRENT_PROGRAM_ID, FCPV.CONCURRENT_PROGRAM_NAME, FCPV.U ...

  4. Oracle EBS-SQL (SYS-22):sysadmin_用户职责查询.sql

    select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, ...

  5. Oracle EBS-SQL (SYS-7):表单个性化查询.sql

    SELECT * FROM FND_FORM_CUSTOM_RULES; SELECT * FROM FND_FORM_CUSTOM_ACTIONS; SELECT * FROM FND_FORM_C ...

  6. Oracle EBS-SQL (SYS-2): sys_在线用户查询.sql

    SELECT fs.USER_NAME,       fu.description,       fs.RESPONSIBILITY_NAME,       fs.USER_FORM_NAME,    ...

  7. Oracle EBS-SQL (SYS-1): sysadmin_用户职责查询.sql

    select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, ...

  8. MySql 学习之 一条查询sql的执行过程

    相信大家都接触过Mysql数据库,而且也肯定都会写sql.我不知道大家有没有这样的感受,反正我是有过这样的想法.就是当我把一条sql语句写完了,并且执行完得到想要的结果.这时我就在想为什么我写这样的一 ...

  9. oracle下查询的sql已经超出IIS响应时间

    场景: 最近一直发生oracle下查询的sql已经超出IIS响应时间,但是后台DB的SQL查询还未终止,一直在查询.这对DB是造成很大的压力. 解决办法 增加OracleCommand 中的Comma ...

  10. ORACLE分页查询SQL语法——最高效的分页

    --1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT  ...

随机推荐

  1. 用海豚调度器定时调度从Kafka到HDFS的kettle任务脚本

    在实际项目中,从Kafka到HDFS的数据是每天自动生成一个文件,按日期区分.而且Kafka在不断生产数据,因此看看kettle是不是需要时刻运行?能不能按照每日自动生成数据文件? 为了测试实际项目中 ...

  2. CSV文件导出详细讲解

    一.准备jar  如下所以放入maven配置文件中 二.controller层 三.SERVICE层 四.CsvUtil文件 /** * csv文件导入导出 */public class CsvUti ...

  3. curl可以访问虚拟机资源,但是宿主机浏览器不能访问

    如果想从宿主机访问到虚拟机内的php,需要关闭宿主机的代理,并且设置虚拟机内的防火墙不要屏蔽宿主机的ip. 设置虚拟机防火墙方法: 查找宿主机IP:win+r,输入ipconfig 打开虚拟机,输入s ...

  4. springboot经验之sql注入、xss注入拦截(POST)

    简介 sql注入.xss注入.cors攻击的简介以及解决方案,可以参考下面链接: https://blog.csdn.net/yhhyhhyhhyhh/article/details/84504487 ...

  5. 使用jquery的tmpl构建复杂表格

    Tmpl提供了几种tag:${}:等同于{{=}},是输出变量,通过了html编码的.{{html}}:输出变量html,但是没有html编码,适合输出html代码.{{if }} {{else}}: ...

  6. 简简单单教你如何用C语言实现获取当前所有可用网口!

    一.获取本机所有可用网卡名 原理: 在 Linux 系统中,/proc 目录是一个位于内存中的伪文件系统. /proc目录是内核提供给我们的查询中心,通过查询该目录下的文件内容,可以获取到有关系统硬件 ...

  7. rk3568 | 瑞芯微平台GPIO引脚驱动编写

    最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...

  8. C语言操作时间函数time.ctime,实现定时执行某个任务小例子

    时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下. 时间概述 由上图可知: 通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calenda ...

  9. PHP中的Malformed UTF-8 characters错误解决

    在PHP开发中,开发者经常会遇到Malformed UTF-8 characters错误.这个错误通常是由于代码中存在无效的UTF-8字符而引起的.本篇博客将为您介绍如何解决这个问题. 什么是UTF- ...

  10. WinUI 3学习笔记(1)—— First Desktop App

    随着Visual Studio 2019 16.10版本的正式发布,创建WinUI 3的APP对我们来说,已不存在任何的难度.本篇我们就试着来一探究竟,看看WinUI 3 APP到底是个啥玩意,能不能 ...