`

动态交叉表

阅读更多
 PROCEDURE cross_table_test(DATACUR OUT SYS_REFCURSOR,L_QUERY_OUT OUT LONG) IS
  
   
    L_QUERY LONG;
    L_DYNAMIC_COLUMN  LONG;
    NUM_MAX_YEAR NUMBER;
    NUM_MIN_YEAR NUMBER;
  BEGIN
  
    SELECT MAX(NUM_YEAR) INTO NUM_MAX_YEAR FROM CROSS_TABLE_TEST;
  
    SELECT MIN(NUM_YEAR) INTO NUM_MIN_YEAR FROM CROSS_TABLE_TEST;
    --DBMS_OUTPUT.put_line(NUM_MAX_YEAR);
    --DBMS_OUTPUT.put_line(NUM_MIN_YEAR);
    
    /*
    动态构造交叉表
    */
    FOR i in NUM_MIN_YEAR..NUM_MAX_YEAR
    LOOP
      --DBMS_OUTPUT.put_line(i);
      L_DYNAMIC_COLUMN := L_DYNAMIC_COLUMN || ' SUM(DECODE(NUM_YEAR, ' || i ||  ' , NUM_COST, 0)) ' || 'AS cost_'|| i || ',' ;
      
      IF i = NUM_MAX_YEAR THEN 
           L_DYNAMIC_COLUMN := L_DYNAMIC_COLUMN || ' SUM(DECODE(NUM_YEAR, ' || i ||  ' , NUM_SALES, 0)) ' || 'AS sales_'|| i /*|| ','*/;              
      ELSE
           L_DYNAMIC_COLUMN := L_DYNAMIC_COLUMN || ' SUM(DECODE(NUM_YEAR, ' || i ||  ' , NUM_SALES, 0)) ' || 'AS sales_'|| i || ','; 
      END IF;
    END LOOP;
  
   L_QUERY := ' SELECT ID_PART, TXT_PART, ';
  
   L_QUERY := L_QUERY || ' SUM(NUM_COST) AS TOT_COST , SUM(NUM_SALES) AS TOT_SALES ,';
   L_QUERY :=  L_QUERY || L_DYNAMIC_COLUMN ;
   L_QUERY := L_QUERY || '  FROM CROSS_TABLE_TEST GROUP BY ID_PART, TXT_PART' ;
   
   /*
   输出动态SQL ,调试用
   */
   L_QUERY_OUT := L_QUERY; 
    /*
    非动态的交叉表
    OPEN DATACUR FOR
      SELECT ID_PART,
              TXT_PART,
              SUM(DECODE(NUM_YEAR, 2004, NUM_COST, 0)) AS cost_2004,
              SUM(DECODE(NUM_YEAR, 2004, NUM_SALES, 0)) AS sales_2004
         FROM CROSS_TABLE_TEST
        GROUP BY ID_PART, TXT_PART;
     */
  
  OPEN DATACUR FOR L_QUERY;
  
  
  END cross_table_test;

 

 

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;


public class Test {

	/**
	 * @param args
	 * @throws ClassNotFoundException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws SQLException 
	 */
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {
		Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();  
		String url="jdbc:oracle:thin:@3.242.164.94:1521:xxxx"; //xxxx为数据库的SID  
		String user="xxxx";  
		String password="xxxx";  
	    Connection conn= DriverManager.getConnection(url,user,password);
	    OracleCallableStatement proc = (OracleCallableStatement)conn.prepareCall("{call cross_table_test(?,?)}");
        proc.registerOutParameter(1, OracleTypes.CURSOR);
        proc.registerOutParameter(2, OracleTypes.LONGVARCHAR);
        
       
        proc.execute();
        ResultSet rs = (ResultSet)proc.getObject(1);
        String str = proc.getObject(2).toString();
        //System.out.println(str);
        
        ResultSetMetaData rsMetaData = rs.getMetaData();
        int intColumn = rsMetaData.getColumnCount();
        
        for (int i =1;i<=intColumn;i++){
        	String strColumn =rsMetaData.getColumnName(i);
        	System.out.print(  (strColumn.length()>7?strColumn.substring(0,7):strColumn) +"\t\t");
    	}
        System.out.println();
        
        while(rs.next()) {
        	for (int i =1;i<=intColumn;i++){
        		System.out.print(rs.getString(i)+"\t\t");
        	}
        	System.out.println();
        }

	}

}

 

分享到:
评论

相关推荐

    C#动态交叉表查询

    在编程领域,尤其是在使用C#进行数据处理时,动态交叉表查询是一种常用的技术,它能够帮助我们以矩阵或网格的形式展示数据,使我们能够轻松地分析多维数据集。动态交叉表查询允许开发者根据需求自定义列和行,提供...

    基于动态交叉表的Web多维分析系统设计与实现.pdf

    ### 基于动态交叉表的Web多维分析系统设计与实现 #### 一、引言 在现代商业环境中,企业越来越依赖于大数据分析来驱动决策制定。在这些场景下,传统的在线分析处理(OLAP)工具虽然强大,但在基于Web的应用程序中...

    SQL动态交叉表,希望对SQL程序员有帮助

    在SQL编程中,动态交叉表查询是一种非常实用的技术,它能够帮助我们以表格形式展示多维度数据,使得数据更易理解和分析。交叉表,又称作透视表或转置表,通常用于将行与列的数据位置互换,或者将某一列的数据作为新...

    在Sql Server 数据库中利用存储过程实现动态交叉表

    动态交叉表则是指在数据库查询过程中,根据实际运行时的动态条件,生成交叉表查询结果的技术。本文将探讨如何在SQL Server数据库中利用存储过程实现动态交叉表。 首先,我们需要理解交叉表的基本概念。在数据分析和...

    在Sql Server数据库中利用存储过程实现动态交叉表.pdf

    "在Sql Server数据库中利用存储过程实现动态交叉表.pdf" 本文主要讲述了在Sql Server数据库中利用存储过程实现动态交叉表的技术。交叉表是一种特殊的表格形式,它可以将数据按照某种规则进行转换和重新组织,以便更...

    Jfreechart动态交叉表的生成与应用.pdf

    ### Jfreechart动态交叉表的生成与应用 #### 摘要 本文主要探讨了如何在Java与Oracle环境下生成动态交叉表(Crosstab),并分析了其在实际应用中的重要性和具体实施方法。数据库设计时需遵循数据范式的要求以确保...

    范式下的Oracle数据库设计及其动态交叉表的生成.pdf

    例如,将学生表、科目表、成绩表等通过JOIN操作连接,可以生成类似于表1的动态交叉表,显示每个学生在各个科目的成绩。 关键词中的“多表联合”即指此类操作,通过INNER JOIN、LEFT JOIN、RIGHT JOIN或FULL OUTER ...

    范式下的Oracle数据库设计及其动态交叉表的生成 (1).pdf

    《范式下的Oracle数据库设计及其动态交叉表的生成》这篇文献主要探讨了在数据库设计中遵循范式的重要性,以及如何在Oracle数据库中实现动态交叉表的生成。文章以提高数据库性能和数据完整性为目标,深入剖析了数据库...

    Oracle动态交叉表生成

    Oracle动态交叉表生成是数据库管理中的一个重要概念,尤其在处理范式化数据时。范式化设计是数据库设计的基础,它旨在减少数据冗余、提高数据一致性并降低维护成本。Oracle数据库作为广泛应用的大型关系数据库管理...

    利用水晶报表动态绑定数据源实现动态交叉表的方法研究

    【水晶报表动态绑定数据源实现动态交叉表】是一种在.NET和SQL Server环境下处理报表生成的技术。动态交叉表是根据用户需求灵活展示数据的一种方式,它能够根据数据的分类和汇总实时调整列的数量和名称。在规范化...

    sqlserver 交叉表通用存储

    给定的部分内容展示了如何通过SQL Server的存储过程实现动态交叉表的功能。下面将对这段代码进行逐行分析: ```sql CREATE PROC p_qry @TableNames sysname,-- @sysname,-- @sysname,-- @sysname,--ֶ @ǷӺϼ...

    birt API 动态创建交叉表

    BIRT(Business Intelligence and Reporting Tools)是Eclipse基金会下的一个开源报表系统,它提供了一整套工具,使得开发者能够利用API动态地创建和定制复杂的报表,包括交叉表(Cross Tab)。交叉表是一种数据汇总...

    交叉表的语法动态交叉的sql语句

    交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句 交叉表的语法,动态交叉的sql语句交叉表的语法,动态交叉的sql语句

    动 态 交 叉 表.rar

    动态交叉表,也被称为Pivot Table,在数据分析领域中是一种强大的工具,用于整理和汇总大量数据。它是Excel、SQL、Python的pandas库等数据分析软件中的一个重要功能,可以帮助用户快速理解和总结复杂的数据集。 1. ...

    abc.rar_ABC_交叉表

    总结来说,"abc.rar"可能是一个具有动态交叉表功能的程序,它允许用户灵活地分析和探索数据,以适应不同的业务需求。要充分利用这个工具,需要了解其内部结构,学习如何配置和操作,以及如何结合具体的数据集进行...

    VB动态交叉表查询实例

    摘要:VB源码,数据库应用,交叉表查询 VB6.0与SQL2000结合演示的动态交叉表查询方法,测试前请首先附加Database文件中的数据库,然后再运行可执行文件。  数据库的附加方法如下:  1.将目录database下的xs_Data.MDF...

    sql server 生成交叉表

    通过以上步骤,我们可以看到,在SQL Server中生成交叉表不仅可以利用动态SQL来实现,而且这种方式非常灵活,可以根据不同的需求动态调整查询逻辑。这种方法适用于需要快速响应不同数据透视需求的场景,尤其对于报表...

Global site tag (gtag.js) - Google Analytics