拼接方法:   
     /// <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. apisix-dashboard上添加自定义插件

    参考:https://overstarry.vip/posts/apisix如何添加自定义插件/ 首先,我们需要向自定义的插件user-remote-auth添加到apisix中,对这块不清楚的同学, ...

  2. 手把手教Linux驱动4-进程、文件描述符、file、inode关系详解

    本文目标 什么是文件描述符? 进程打开文件相关信息管理 Linux设备文件三大结构:inode,file,file_operations mknod 做了什么事? 进程打开设备文件 驱动如何支持同类型 ...

  3. 使用FModel提取黑神话悟空的资产

    目录 前言 设置 效果展示 闲聊 可能遇到的问题 没有相应的UE引擎版本选项 前言 黑神话悟空昨天上线了,解个包looklook. 本文内容比较简洁,仅介绍解包黑神话所需的专项配置,关于FModel的 ...

  4. DPDK简介

    DPDK简介 DPDK(Data Plane Development Kit)数据平面开发工具包,是一个开源软件项目.DPDK通过维护一系列能够加速多核CPU数据包处理的库,提供数据处理框架.DPDK ...

  5. SparkStreaming本地化策略性能调优与使用场景分析

    1.背景介绍:平台使用的华为FI C203的版本,通过SparkStreaming消费kafka数据后,进行算法处理入库.其中在算法部分耗时为4秒,每个批的数据量在30MB左右.执行算法部分的算子分区 ...

  6. 廉价平替esphome水浸 雨水传感器diy

    2024年7月27日 改进了手头的所有8266 都加了红外和dht11 干了一件非常抽象的事情 调试的时候给dht11 插到5v了 单薄的它好像要融化了 binary_sensor: # 水浸 雨水 ...

  7. apr库编译及队列使用笔记

    操作系统 :CentOS 7.9_x64 apr库版本:apr-1.7.4 & apr-util-1.6.3 gcc 版本:4.8.5 队列功能在C++或Python等脚本语言里面,是很容易就 ...

  8. Goby漏洞发布 | CVE-2024-4879 ServiceNowUI /login.do Jelly模板注入漏洞【已复现】

    漏洞名称:ServiceNowUI /login.do Jelly模板注入漏洞(CVE-2024-4879) English Name:ServiceNowUI /login.do Input Val ...

  9. sql转JSON为表

    创建方法 : /****** Object: UserDefinedFunction [dbo].[parseJSON] Script Date: 2017/7/11 18:27:28 ******/ ...

  10. Angular 18+ 高级教程 – Angular 的局限 の Query Elements

    前言 熟悉 Angular 的朋友都知道,Angular 有非常多的局限,许多事情它都做不好,打开 Github 一堆 2016 - 2017 的 Issues,时至今日都没有解决. 原因也很简单 - ...