`
lucene321
  • 浏览: 178858 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

行列换的一个解决思路,欢迎提意见

    博客分类:
  • java
阅读更多
        工作中常需要把数据库中某数据按照某列转成行。而展现的工具可能又只支持1句sql完成,所以就考虑写视图解决。但是写此类sql既繁琐,又容易出错,所以想写一个自动生成的脚本处理。
解决的问题,例:
表结构为:tab1
  orgid(机构) gender(性别) ,itemid(项目) ,val(值)
    0322 ,0,a,1
   0322 ,0,b,4
   0321 ,1,c,5
   0324 ,1,c,3
展现效果:
0322,0,1,4,0
0321,0,0,0,5
0324,0,0,0,3
解决方法:
配置文件: sql.txt
 
       v_tab1.tab1.orgid,gender.val.itemid.a,b,c  
 
说明:
以"."分割列,分别是:视图名.表名,查询项.分组项.分组值(多值以","分割)

脚本: sql.sh

awk -f'.' '{ 	    test = $6    alen=split(test,cols,",");    for( idx=1;idx<=alen;idx++)    {		sqlalias[idx]="v" idx "_" $4    }         print  " drop view " $1 "  ; "    print  " create view " $1 "  \n as "    print  "select " $3 ","    for( idx=1;idx<=alen;idx++)    {    	if( idx == alen )    		print " \t sum(v" idx "_" $4 ") as v" idx "_" $4     	else    		print " \t sum(v" idx "_" $4 ") as v" idx "_" $4 " ,"    }      	  	print "from ("         for( idx=1;idx<=alen;idx++)    {    	csql = "\tselect " $3 "," "\n \t \t "	    	if( idx != 1 ) csql = "\tunion \n" csql     	for( i=1;i<=alen;i++)    	{    		if( i == idx ) csql = csql $4     		else csql = csql " 0 "    		csql = csql " as " sqlalias[i]    		if( i != (alen) ) csql = csql " , "    	}      	csql = csql " \tfrom " $2 " where " $5 "='\''" cols[idx] "'\''"    	print  csql      	       }	    print " ) aaa "    print " group by "  $3 ";"       }' sql.txt  > test.sql

  
生成的代码:test.sql

 drop view v_tab1  ;  create view v_tab1   as select orgid,gender, 	 sum(v1_val) as v1_val , 	 sum(v2_val) as v2_val , 	 sum(v3_val) as v3_valfrom (	select orgid,gender, 	 	 val as v1_val ,  0  as v2_val ,  0  as v3_val 	from tab1 where itemid='a'	union 	select orgid,gender, 	 	  0  as v1_val , val as v2_val ,  0  as v3_val 	from tab1 where itemid='b'	union 	select orgid,gender, 	 	  0  as v1_val ,  0  as v2_val , val as v3_val 	from tab1 where itemid='c' ) aaa  group by orgid,gender;


 
使用方法:

     select * from v_tab1  

  
适用范围:
  报表,查询。
  通过该方法,在没有报表工具的情况下解决了行列转换问题。
已知缺点:
   1.由于不熟悉perl,简单解决方案,所以觉得用awk处理,这样处理导致配置文件配置不灵活
   2.在数据量过大的时候,这种查询效率也不会高,不过既然要行列转换,性能总是要有牺牲。
     在db2中,没有oracle的decode类似的函数(也许有也可能,我没仔细去找),所以用union,不过我猜想即使用decode,效率也是差不多,当然仅仅是猜想而已,没在oralce下测试过。union实现要比左外连接效率要高很多,这方面测试过。
    如果确实有更高性能要求,把创建试图语句改成创建表,每天晚上执行生成的insert语句即可。(bi项目的数据,通常至少延迟1天,所以可在晚上跑数据)


补充说明:
  我是采用union实现的,但其实也可生成case when,decode(oralce)方式实现,但其实这与本主题并不矛盾。本方法不过是提出一个通过脚本生成相关sql的思路,重点不在sql技巧。
  至于效率问题,如果很效率问题是瓶颈,可以改动awk生成creat table ,insert语句,然后定时抽取。
我前面做的那个项目,就是通过类似手段解决问题的。简单描述:通过某种定制手段,直接生成sql,实行数据仓库的清洗工作。这也是我们几个数据仓库的项目经验总结。经证实,这种方法确实切实有效,减少了大家相当多的工作量。前面一个数据仓库投入11个人左右,而这个项目我们只投入了7人,除项目经理外还有2人很少编码(做业务分析去了)。但是项目中,我们大量采用类似方法实现,带来了相当大效果。
  后面这个项目数据量虽然比前面的小,但是业务其实更复杂。通过大量使用脚本,开发效率得到了大大提升。难怪以前的一个同事说:在他们现公司他们部门,所有的开发都是脚本,几乎不用脚本外的与语言。该兄弟其实可是c语言高手,现在完全投入到脚本怀抱中去了。


 
0
11
分享到:
评论

相关推荐

    Openoffice转换多列EXCEL为PDF行列对应解决方法

    "OpenOffice转换多列Excel为PDF行列对应解决方法"这个主题涉及到一个常见的问题,即如何在保持数据结构清晰的前提下,有效地进行格式转换。OpenOffice是一款免费的办公软件套件,它提供了类似Microsoft Office的功能...

    Openoffice转换多列EXCEL为PDF行列对应解决方法.rar

    首先,创建一个批处理脚本,指定转换的文件路径和输出的PDF路径,然后运行脚本来一次性完成转换。 通过以上步骤,你可以有效地解决OpenOffice在转换多列Excel为PDF时可能出现的行列对应问题。在转换过程中,保持...

    table行列数据转换

    例如,如果有一个DataTable dt,其中列名为"Column1"和"Column2",我们可以创建一个新的DataTable dtTranspose,然后遍历每一行,将列值作为新行的列值插入。 2. **List的行列转换** 当数据存储在List...

    兼容主流浏览器的纯JS动态拖动表格实现行列内容交换

    项目开发中需要用到一个拖动交换表格的功能,上网搜到雅虎的一...就自己综合网上资源写了一个可兼容IE,firefox,Chrome,Safari和Opera等主流浏览器的纯JS动态拖动表格实现行列内容交换。主要代码就不到400行JS而已。

    C++编写一个只含正数的行列式程序

    行列式(Determinant)是一个重要的数学概念,通常用于线性代数领域,它对于解决线性方程组、求解特征值问题等具有重要意义。行列式的计算方法有很多种,其中一种常用的方法是通过高斯消元法将原矩阵转换为上三角...

    Excel行列号转化

    以下是对Excel行列号转化这一主题的详细说明: 1. **行列号的基本概念** - **行号**:从1开始递增,表示表格中的每一行。 - **列号**:从A开始,依次为B、C直至Z,然后进入双字母组合如AA、AB,以此类推。 2. **...

    sql行列互换

    首先,我们来看一个在 SQL Server 中实现行列互换的例子。这里有一个名为 `tbltest1` 的表,包含学生名(`student`)、科目(`kemu`)以及分数(`fenshu`)等字段。 ```sql -- 原始数据表结构 CREATE TABLE tbltest...

    计算N阶行列式的若干方法

    例如,如果一个n阶行列式是对称的或者反对称的,那么可以借助这些性质简化计算。对于反对称行列式,当阶数为奇数时,其值总是0。 3. **化为三角形行列式**: 通过行列式的行变换(如行交换、倍加等),可以将行列...

    c++行列式求值源码

    在C++编程中,计算矩阵的行列式是线性代数中的一个重要操作,它在解决线性方程组、分析矩阵的性质以及图形学等领域有着广泛的应用。行列式的值可以帮助我们判断一个矩阵是否可逆,如果一个矩阵的行列式不为零,则该...

    一类行列式的计算_范德蒙行列式和行列式乘积的应用

    通过计算\(D_3\)与范德蒙行列式\(D\)的乘积,得到一个新的行列式\(D_4\)。由于\(D_3\)和\(D\)的值相对容易计算,因此可以利用行列式乘法的性质来简化\(D_4\)的计算。 具体地,\(D_4\)的每一行可以视为特定多项式在\...

    JAVA编写n阶行列式求值程序

    根据给定文件的信息,本文将详细介绍如何使用Java编程语言实现一个计算任意阶数行列式的程序。主要内容包括理解行列式的概念、解析程序结构以及探讨其实现原理。 ### 行列式的概念 行列式是一种特殊的数学对象,它...

    sql动态转换行列和字符的分割

    例如,如果你有一个销售数据表,其中包含产品、月份和销售额,你可以使用`PIVOT`将每个月的销售额作为单独的列显示,使得每个产品都有一个行,每列代表一个月的销售额。这在展示数据时提供了更好的可读性。 2. **...

    行列转,换行列转换

    在实际工作中,行列转换经常被用于解决以下问题: - **数据聚合**:将分散在多行的数据汇总到一行中。 - **数据透视**:将数据表的结构进行调整,以便更好地分析数据。 - **数据可视化**:为了图表显示的需要,将...

    VB编写行列式的计算

    行列式是线性代数中的一个基本概念,用于表示矩阵的一种数值特性。在VB(Visual Basic)编程环境中,我们可以利用其强大的数据处理能力和用户界面设计功能来实现行列式的计算。以下将详细介绍如何在VB中编写行列式的...

    行列式方法

    行列式方法是线性代数中的一个重要概念,用于处理矩阵的一种数学技巧,它涉及到矩阵的性质和计算。在处理特定类型的行列式时,有时可以利用一些特殊的策略来简化计算过程,尤其是在解决奇数阶反对称行列式的问题时。...

    C语言计算行列式 4 段程序

    第三个程序使用了一个简单的交换元素的方式来调整最大元素的位置,而第四个程序使用了一个更复杂的算法来计算行列式。 知识点: * 高斯消元法:一种常用的矩阵计算方法,用于计算行列式的值。 * fabs 函数:数学库...

    行列式计算方法

    1. **子式**:在计算一个高阶行列式时,可以从其中选取一行(或一列),该行(或列)中的每个元素与其对应的余子式结合,形成一个新的行列式,这个新的行列式称为原行列式的子式。 2. **余子式**:对于一个多阶行列...

    sql表数据行列互换

    本文将详细介绍如何在SQL中实现表数据的行列互换,并通过一个具体的例子来展示两种实现方式。 #### 问题背景 假设我们有一张学生成绩表`tb`,其结构如下: - `Name`:学生姓名 - `Subject`:科目名称 - `Result`:...

Global site tag (gtag.js) - Google Analytics