zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    在使用触摸屏的情况下插拔USB鼠标,鼠标箭头消失
    使用网卡在接收数据包时不会自动组包
    linux开机发现会有个kworker进程规律性占用CPU负载超过50%
    系统时间是否可以精确到ms级别?
    linux开机进入登录界面,输入密码后屏幕黑屏3-10s,然后重新回到登录界面
    linux多网卡情况下,一个网卡进行组播,一个网卡进行点播,同时配置网关后无法通信
    linux中常见内存分配函数(kmalloc,vmalloc等)
    linux内核中的两个标记GFP_KERNEL和GFP_ATOMIC作用是什么?
    gcc: error: unrecognized argument in option ‘-mabi=aapcs-linux’
    shell脚本100例
  • 原文地址:https://www.cnblogs.com/cy2011/p/6957933.html
Copyright © 2011-2022 走看看