/*
在实际使用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/180361. 首先是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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)