关于oracle的查询结果的行列互换

关于oracle的查询结果的行列互换,第1张

/*

在实际使用sql工作中总会碰到将某一列的值放到标题中显示 就是总说的行列转换或者互换

比如有如下数据:

ID NAME       KECHENG              CHENGJI

  a          语文                

  a          数学                

  b          语文                

  b          数学                

  c          语文                

  c          数学                

那末我要求显示的结果是:

NAME       YUWEN                  SHUXUE

a                              

也就是说把课程这一列放到行上显示 把成绩按照课程分配到相对应的行

我只介绍 中简单易用的方法 使用游标或者建立临时表的方法就不介绍了 效率很慢 不易理解

首先建立表:

*/

create table fzq

(

id varchar( )

name varchar( )

kecheng varchar( )

chengji varchar( )

)

插入数据:

insert into fzq values ( a 语文 )

insert into fzq values( a shuxue )

insert into fzq values ( b yuwen )

insert into fzq values ( b shuxu )

insert into fzq values ( c yuwen )

insert into fzq values ( c shuxu )

/*首先使用union 如果课程这列有多个值 那么脚本的代码就很长了 */

select name sum(yuwen) yuwen sum(shuxue) shuxue from

(

select name chengji yuwen shuxue from fzq

where kecheng= yuwen union

select name yuwen chengji  shuxue

from fzq

where kecheng= shuxue

) aaa

group BY name

/*执行结果:

NAME       YUWEN                  SHUXUE

a                              

b                              

c                              

*/

/*

其次是用case 这种方法代码比较短 适合列值很多的情况

*/

select name sum(case kecheng when yuwen then chengji end) yuwen

sum(case kecheng  when shuxue then chengji  end) shuxue

from fzq

group by name

/*执行结果:

NAME       YUWEN                  SHUXUE

a                              

b                              

c                              

所有例子在oracle中测试 sql server没有测试 请根据实际情况修改

*/

select name sum(decode(kecheng 语文 chengji null)) 语文

sum(decode(kecheng 数学 chengji null)) 数学

sum(decode(kecheng 英语 chengji null)) 英语

from fzq

lishixinzhi/Article/program/Oracle/201311/18036

1. 首先是jdbc.properties属性文件的编写,便于数据库移植:

datasource.driverClassName=oracle.jdbc.driver.OracleDriver

datasource.url=jdbc:oracle:thin:@10.6.1.11:1521:student

datasource.username=zs

datasource.password=zs

datasource.defaultAutoCommit=true 

hibernate.dialect=org.hibernate.dialect.Oracle9Dialect

 

#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3

c3p0.acquireIncrement=5

#初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 

c3p0.initialPoolSize=10

#每60秒检查所有连接池中的空闲连接。Default: 0 

c3p0.idleConnectionTestPeriod=600

#-连接池中保留的最小连接数。

c3p0.minPoolSize=5

#连接池中保留的最大连接数。Default: 15 

c3p0.maxPoolSize=50

#JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements

#属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。

#如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0

c3p0.maxStatements=100

#c3p0是异步 *** 作的,缓慢的JDBC *** 作通过帮助进程完成。扩展这些 *** 作可以有效的提升性能

#通过多线程实现多个 *** 作同时被执行。Default: 3

c3p0.numHelperThreads=10

#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 

c3p0.maxIdleTime=600

 

#hibernate.dialect=org.hibernate.dialect.SQLServerDialect

hibernate.jdbc.batch_size=25

hibernate.jdbc.fetch_size=50

hibernate.show_sql=true

hibernate.connection.release_mode=after_transaction

  

2. 其次是spring配置文件的数据源配置:

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">

 <property name="location">

  <value>/WEB-INF/classes/conf/jdbc/jdbc.properties</value>

 </property>

</bean>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" dependency-check="none">

 <property name="driverClass">

  <value>${datasource.driverClassName}</value>

 </property>

 <property name="jdbcUrl">

  <value>${datasource.url}</value>

 </property>

 <property name="user">

  <value>${datasource.username}</value>

 </property>

 <property name="password">

  <value>${datasource.password}</value>

 </property>

 <!-- 当连接池中连接耗尽的时候c3p0一次同时获取的连接数 -->

 <property name="acquireIncrement">

  <value>${c3p0.acquireIncrement}</value>

 </property>

 <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->   

 <property name="initialPoolSize">

  <value>${c3p0.initialPoolSize}</value>

 </property>

 <!-- 最小连接数 -->

 <property name="minPoolSize">

  <value>${c3p0.minPoolSize}</value>

 </property>

 <!-- 最大连接数 -->

 <property name="maxPoolSize">

  <value>${c3p0.minPoolSize}</value>

 </property>

 <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->    

 <property name="maxIdleTime">

  <value>${c3p0.maxPoolSize}</value>

 </property>

 <!--每60秒检查所有连接池中的空闲连接。Default: 0 -->

 <property name="idleConnectionTestPeriod">

  <value>${c3p0.idleConnectionTestPeriod}</value>

 </property>

 <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements属于单个connection而不是整个连接池。

 所以设置这个参数需要考虑到多方面的因素。如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0-->

 <property name="maxStatements">

  <value>${c3p0.maxStatements}</value>

 </property>

 <!--c3p0是异步 *** 作的,缓慢的JDBC *** 作通过帮助进程完成。扩展这些 *** 作可以有效的提升性能通过多线程实现多个 *** 作同时被执行。Default: 3-->    

 <property name="numHelperThreads">

select 'B' 列x,

   (select b from tabname where a='2011') 列2011,

    (select b from tabname where a='2012') 列2012,

    ...

from dual

union 

select 'C' 列x,

   (select c from tabname where a='2011') 列2011,

    (select c from tabname where a='2012') 列2012,

    ...

from dual


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9929039.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存