oracle下拼同比环比查询sql方法
拼接方法:
/// <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方法的更多相关文章
- oracle下导出某用户所有表的方法
oracle下导出某用户所有表的方法 scott/tiger是用户名和密码,handson是导出的实例名 按用户方式导出数据(owner当中写的是用户名) exp scott/tiger@handso ...
- asp下实现多条件模糊查询SQL语句
常写一个简单的模糊查询的SQL语句格式可以如下例: sql="select * from 表名 where 字段名 like ’%" & request.form(&quo ...
- oracle ebs中并发程序定义查询sql
---concurrent program define SELECT FCPV.CONCURRENT_PROGRAM_ID, FCPV.CONCURRENT_PROGRAM_NAME, FCPV.U ...
- Oracle EBS-SQL (SYS-22):sysadmin_用户职责查询.sql
select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, ...
- Oracle EBS-SQL (SYS-7):表单个性化查询.sql
SELECT * FROM FND_FORM_CUSTOM_RULES; SELECT * FROM FND_FORM_CUSTOM_ACTIONS; SELECT * FROM FND_FORM_C ...
- Oracle EBS-SQL (SYS-2): sys_在线用户查询.sql
SELECT fs.USER_NAME, fu.description, fs.RESPONSIBILITY_NAME, fs.USER_FORM_NAME, ...
- Oracle EBS-SQL (SYS-1): sysadmin_用户职责查询.sql
select fu.user_name 用户名, fu.description 用户说明, frv.RESPONSIBILITY_NAME 职责名称, REQUEST_GROUP_NAME 报表组, ...
- MySql 学习之 一条查询sql的执行过程
相信大家都接触过Mysql数据库,而且也肯定都会写sql.我不知道大家有没有这样的感受,反正我是有过这样的想法.就是当我把一条sql语句写完了,并且执行完得到想要的结果.这时我就在想为什么我写这样的一 ...
- oracle下查询的sql已经超出IIS响应时间
场景: 最近一直发生oracle下查询的sql已经超出IIS响应时间,但是后台DB的SQL查询还未终止,一直在查询.这对DB是造成很大的压力. 解决办法 增加OracleCommand 中的Comma ...
- ORACLE分页查询SQL语法——最高效的分页
--1:无ORDER BY排序的写法.(效率最高)--(经过测试,此方法成本最低,只嵌套一层,速度最快!即使查询的数据量再大,也几乎不受影响,速度依然!) SELECT * FROM (SELECT ...
随机推荐
- 【转载】 pytorch锁死在dataloader(训练时卡死)
版权声明:本文为CSDN博主「Totoro-wen」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/qq_325 ...
- 【EF Core】自动生成的字段值
自动生成字段值,咱们首先想到的是主键列(带 IDENTITY 的主键).EF Core 默认的主键配置也是启用 Identity 自增长的,而且可以自动标识主键.前提是代表主键的实体属性名要符合以下规 ...
- js 实现俄罗斯方块(一)
上学的时候就想尝试写个游戏了,不过那时一直想的都是些不太切合自身能力的高级游戏(需要花很多时间学习引擎,需要美工等等)最终都没有实现. 最近突然又想写了就利用业余时间写了个俄罗斯方块js写的画面也比较 ...
- PKUSC2019 D1T1 题解
前言 五一网课的例题,但是网上没有详细的题解(其实就是都没放代码),所以来写一篇,就当攒 RP 了.题目可以在这里(不强制在线)或这里(强制在线)提交. 题目简述 有 \(n\)(\(n \leq 5 ...
- 用DolphinScheduler轻松实现Flume数据采集任务自动化!
转载自天地风雷水火山泽 目的 因为我们的数仓数据源是Kafka,离线数仓需要用Flume采集Kafka中的数据到HDFS中. 在实际项目中,我们不可能一直在Xshell中启动Flume任务,一是因为项 ...
- 升级JDK时涉及的工作任务
JDK版本升级,通常引入新的语言特性.新的API,废弃一些API,从而导致一些不兼容的现象. 因此在升级产品使用的JDK版本时,通常有如下考虑: 新产品包括新建设的项目以及刚启动不久的项目,使用高版本 ...
- HTB-Permx靶机笔记
Permx靶机笔记 概述 permx靶机是HTB的简单靶机,这台靶机整体考验渗透人员的信息搜集能力,可以收只有信息搜集的快速,才能快速拿到它的flag. 整体是比较简单的靶机 靶机连接:https:/ ...
- PG数据库导致断电/重启无法正常启动问题排查
PG数据库导致断电/重启无法正常启动问题排查 一.问题 数据库断电后,启动PG数据库后无法正常启动,报"psql: could not connect to server: No such ...
- harbor重启后无法自启动解决方案
1. 创建 systemd 服务单元文件 编辑服务文件: 使用以下命令创建并编辑 systemd 服务文件: sudo vim /etc/systemd/system/harbor.service 添 ...
- Graphics2D绘图方法总结
一.简介 在开发中可能会遇到这样一类场景,业务复杂度不算太高,技术难度不算太深,但是做起来就很容易把人整破防,伤害很高侮辱性很强的:绘图. 绘图最怕有人挑刺:这里变形,那里不对,全图失真. 最近在处理 ...