sql不行啊,要用一个过程阿.以前csdn上有.
解决方案 »
- loadjava 问题!急急急
- 关于Oracle sequence的问题
- 请教达人:往数据库中要插入1亿多条数据用JAVA程序实现可行吗?
- oracle,data mining,data miner连接时报错:Specified schema is not configured for use with Oracle Data Mining
- 编写一个存储过程,要求返回参数至少有一个是结果集
- 动态sql 的引号问题?
- 如何删除数据库(不是数据表)?
- "ORA-03127: 在活动操作结束之前不允许进行新的操作"是什么意思?
- 关于日期的where查询语句
- 回滚段问题
- 导数据的问题
- 菜鸟求助SQL语句:如何删除这个字段?
供应商数量有限制的话,可以用decode()来解决。
to liuyi8903(西西):谢谢您的参与!你好像胸有成竹,能不能说的详细点。列头是所有的供货商,所以我可以通过查询供货商表取得列头,如果只取出某一个供货商的价格很简单,但这里不是要对比显示嘛!能不能说的详细点!拜托您啦!
to 大家:谢谢大家参与,请大家继续关注!
/*
原表:
name km cj
---------- ---------- -----------
张三 语文 80
张三 数学 86
张三 英语 75
李四 语文 78
李四 数学 85
李四 英语 78目标表:
姓名 数学 英语 语文 总分
---------- ---------- ----------- ----------- -----------
李四 85 78 78 241
张三 86 75 80 241
*/create table #test (name varchar(10),km varchar(10),cj int)
insert #test select '张三','语文',80
union all select '张三','数学',86
union all select '张三','英语',75
union all select '李四','语文',78
union all select '李四','数学',85
union all select '李四','英语',78
go
select * from #testselect name 姓名,
sum(case km when '语文' then cj end) 语文,
sum(case km when '数学' then cj end) 数学,
sum(case km when '英语' then cj end) 英语,
sum(cj) 总分
from #test group by namedeclare @sql varchar(8000)
set @sql='select name 姓名'
select @sql= @sql+ ',sum(case km when '''+km+''' then cj end) ' + km from (select distinct km from #test) a
set @sql=@sql+',sum(cj) 总分 from #test group by name'
exec (@sql)
go
drop table #test--在sqlserver板块搜索“行转列”或者是“交叉表”会有好多的帖子介绍的。
在oralce中用decode或是case when。
1:
select @sql = @sql + ',' + col from t
2:
t-sql中只要构造初上面的@sql,然后执行动态sql,将其放在一个存储过程里面。就自动返回结果集,很方便,p-sql返回结果集要用游标吧,好像不是很方便。
--
请问:如果解决不了,那存储过程返回结果集可以吗?
定义一个包
ref cursor变量
在存储过程里面
根据实际情况组合出sql语句(针对与这个问题,用一个循环语句就行了)然后open cur_name for v_sql; --v_sql存放上面组合的sql语句。
返回这个游标即可。
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
price T2
where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)因为你要先是所有的数据,所以,我就让你的商品和提供商这两个做了FULL JOIN,这样,你要显示的所有的东西,都调出来了,然后,左联结你的价格这个表,这样,有的话,就会,没有的话,就是NULL,你可以控制显示的。这样,就和你得显示方法有关系了,你可以用一个变量,来记录你的物品序号,不同的时候,就是换行。否则,就是rs.next();还有一个问题,就是,你的供货商名称名字的取得,其实,这个就见仁见智了。
1。可以再取一次。只是取供货商表
2。读取晚所有的第一条数据以后,也可以知道。
3。在你的物品表里面添加id是0的数据,它的目的就是取得供货商名称上面的方法3,假如你不想添加,可以用下面的SQL句子。
select 0,0,T11.name,T11.providerName
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11
UNION
SELECT T11.ID,T2.price,T11.name,T11.providerName
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
price T2
where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)假如还有什么问题,可以和我联系。和和。
http://community.csdn.net/Expert/topic/2769/2769512.xml?temp=.780163
1、构造变量sql语句
2、存储过程定义游标返回sql语句的结果集
FROM provider
UNION
SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
price T2
where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)他的这个情况是可以解决的,不一定需要做过程。楼上的人,不要去误导别人。
FROM provider
UNION
SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
price T2
where T11.id = T2.id(+) AND T11.providerId = T2.provider(+)他的这个情况是可以解决的,不一定需要做过程。楼上的人,不要去误导别人。
--
你这个结果不正确,返回的是5列,楼主的列数是不定的。这个需要用过程,即使过程,写起来也不是很容易,建议楼主先熟悉最简单的单表的行列转换,成功了后再修改成为你的三个表的。
FROM provider
UNION
SELECT T11.ID,T11.providerId ,T2.price,T11.name,T11.providerName
FROM (SELECT * FROM goods ,provider Order by goods.id,provider.providerId ) T11,
price T2
where T11.id = T2.id(+) AND T11.providerId = T2.provider(+);执行结果:
ID PROVIDERID PRICE NAME PROVIDERNAME
---------- ---------- ---------- ------------------ --------------------
0 a 0 北京供货商
0 b 0 上海供货商
0 c 0 南京供货商
1 a 100 西门子M55 北京供货商
1 b 120 西门子M55 上海供货商
1 c 西门子M55 南京供货商
2 a 150 诺基亚3100 北京供货商
2 b 110 诺基亚3100 上海供货商
2 c 诺基亚3100 南京供货商已选择9行。
JeromeLiu(烛光):
你根本就没有仔细看过我写的东西,假如你认真看了,或者,分析过,我想,你就不会这么回答我了。 bzszp(SongZip)
可能我的表达方式不对,我只是想说,这个可以通过SQL句子来解决。假如有什么冒犯的话,我只有说一句,对不起了。
能不能借鉴一下Croatia(Croatia) 他们的思路直接实现如楼主
-------------------------------------------------------------------
商品序号 | 商品名称 | 北京供货商 | 上海供货商 | 南京供货商……
-------------------------------------------------------------------
1 西门子M55 100 120 无
2 诺基亚3100 150 110 无
……
这样的查询结果!这样是不更好一点,是不是就可以在页面上不必要判断,以及换行的什么的,我很菜,以上意见,请各们高手想想!我也将密切关注!
你根本就没有仔细看过我写的东西,假如你认真看了,或者,分析过,我想,你就不会这么回答我了。
--
是的,我没有仔细看过,我只是针对楼主的查询结果,而不是说在前台程序中处理,所有很抱歉。
SQL*PLus> desc emp;
名称 是否为空? 类型
----------------------------------------- -------- -----------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)SQL*PLus> select job, deptno, count(*)
2 from emp
3 group by job, deptno;JOB DEPTNO COUNT(*)
--------- ---------- ----------
CLERK 10 2
CLERK 20 4
CLERK 30 2
ANALYST 20 4
MANAGER 10 2
MANAGER 20 2
MANAGER 30 2
SALESMAN 30 8
PRESIDENT 10 2已选择9行。SQL*PLus> select job,
2 max( decode( deptno, 10, cnt, null ) ) dept_10,
3 max( decode( deptno, 20, cnt, null ) ) dept_20,
4 max( decode( deptno, 30, cnt, null ) ) dept_30,
5 max( decode( deptno, 40, cnt, null ) ) dept_40
6 from ( select job, deptno, count(*) cnt
7 from emp
8 group by job, deptno )
9 group by job
10 /JOB DEPT_10 DEPT_20 DEPT_30 DEPT_40
--------- ---------- ---------- ---------- ----------
ANALYST 4
CLERK 2 4 2
MANAGER 2 2 2
PRESIDENT 2
SALESMAN 8-----------------------------------------------------------------------------------
各位,我有如下一个工资表,如:
姓名 工资项 工资
张三 基本工资 1000
张三 岗位工资 2000
张三 效益工资 200
李四 基本工资 1000
李四 效益工资 1000
.......我需要用一个SQL语句得到如下所示的结果:
姓名 基本工资 岗位工资 效益工资 .....
张三 1000 2000 200 .....
李四 1000 0 1000 .....
....
select 姓名, sum(decode(工资项,'基本工资',工资,0)) 基本工资,
sum(decode(工资项,'岗位工资',工资,0)) 岗位工资, ....
from yourtable
group by 姓名
第一个存储过程是用来获取表头的.第二个是获取表内容的.也就是数据.
两个过程都是返回sql
create or replace procedure p_dtsgdttj_getsql_top(as_date1 in varchar2,as_date2 in varchar2, as_resql out long,as_count out integer) is
/*
存储过程功能描述:
获得事故复杂动态表头
--自返回参数:as_resql varchar
--按照所提供的参数信息获取构造的SQL语句
--参数:as_date1 开始时间
-- as_date2 结束时间
*/
type v_cursor is ref cursor;
mycursor v_cursor; --声明游标变量(获得所有的区域编码)
v_code long; --区域编码集合
v_temp long; --临时
v_temp1 long; --临时
v_temp2 long; --临时
v_temp3 long; --临时
v_sql long; --合计的最终sql
v_code1 varchar2(30);
v_name varchar2(100);
v_num number(10);
v_code2 varchar2(20);
v_code3 varchar2(20);
begin
v_temp1 :=' ';
v_temp3 :=' ';
v_num :=0;
v_code :='select ''井号'' as wellno,''钻机编号'' as zuanj,''公司'' as gsname,''区域'' as qymc,''区块'' as qkmc,''井别'' as jbmc,''设计井深(米)'' as shejjs,''实际井深(米)'' as shijjs,''损失金额(元)'' as lossmoney,''损失进尺(米)'' as lossjc,''事故次数'' as accidentcount ';
open mycursor for select distinct sglbbm,f_db_get_jcbmname(sglbbm) from p_sgfzcl where sgsj >= to_date(as_date1,'yyyy-mm-dd') and sgsj <= to_date(as_date2,'yyyy-mm-dd') ;
loop
fetch mycursor into v_code1,v_name ;
exit when mycursor%NOTFOUND;
v_num := v_num + 1;
v_code2 :='sgcs'||trim(to_char(v_num,'0000'));
v_code3 :='sgsj'||trim(to_char(v_num,'0000'));
if v_code1 is null then
v_code1 :=' ' ;
v_name :='未命名';
end if;
v_temp1 :=v_temp1||','''||v_name||''' as '||v_code2;
v_temp3 :=v_temp3||','''||v_name||''' as '||v_code3;
end loop;
v_temp2 :=',''损失时间'' as losstime';
v_temp := v_temp1||v_temp2||v_temp3;
v_code := v_code||v_temp;
v_sql := v_code||' from c_well a where rownum=1';
close mycursor;
as_resql :=v_sql;
as_count := 12 + 2*v_num;
EXCEPTION
WHEN OTHERS THEN
as_resql :='null'; --异常处理信息
as_count := 12 ;
end p_dtsgdttj_getsql_top;create or replace procedure p_dtsgdttj_getsql(as_date1 in varchar2,as_date2 in varchar2, as_resql out long) is
/*
存储过程功能描述:
获得事故复杂动态表体
--自返回参数:as_resql varchar
--按照所提供的参数信息获取构造的SQL语句
--参数:as_date1 开始时间
-- as_date2 结束时间
*/
type v_cursor is ref cursor;
mycursor v_cursor; --声明游标变量(获得所有的区域编码)
v_code long; --区域编码集合
v_temp long; --临时
v_temp1 long; --临时
v_temp2 long; --临时
v_temp3 long; --临时
v_temp4 long; --临时
v_sql long; --合计的最终sql
v_val integer; --某一月份的天数
v_code1 varchar2(30);
v_name varchar2(100);
begin
v_temp1 :=' ';
v_temp3 :=' ';
v_code :='select distinct a.wellname as wellname,a.WELLTEAMNO as zuanj,f_getcomname(a.comname) as gsname,f_db_get_jcbmname(a.qy) as qymc,f_db_get_jcbmname(a.qk) as qkmc,f_db_get_jcbmname(a.jb) as jbmc,a.designdeep as shejjs,a.completedeep as shijjs,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' ,5,1) as lossmoney,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' , 5,2) as lossjc,f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' , 5,3) as accidentcount ';
open mycursor for select distinct sglbbm,f_db_get_jcbmname(sglbbm) from p_sgfzcl where sgsj >= to_date(as_date1,'yyyy-mm-dd') and sgsj <= to_date(as_date2,'yyyy-mm-dd') ;
loop
fetch mycursor into v_code1,v_name ;
exit when mycursor%NOTFOUND;
if v_code1 is null then
v_code1 :=' ' ;
v_name :='未命名';
end if;
v_temp1 :=v_temp1||', f_dongt_xxsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''','''||v_code1||''',5,1) as '||v_name;
v_temp3 :=v_temp3||', f_dongt_xxsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''','''||v_code1||''',5,2) as '||v_name;
end loop;
v_temp2 :=',f_dongt_sumsgtj(a.wellno,'''||as_date1||''', '''||as_date2||''' ,5,4) as losstime';
v_temp := v_temp1||v_temp2||v_temp3;
v_code := v_code||v_temp;
v_sql := v_code||' from c_well a,p_sgfzcl p where p.wellno=a.wellno and sgsj >= to_date('''||as_date1||''','''||'yyyy-mm-dd'') and sgsj <= to_date('''||as_date2||''','''||'yyyy-mm-dd'||''')';
close mycursor;
as_resql :=v_sql;
EXCEPTION
WHEN OTHERS THEN
as_resql :='null'; --异常处理信息
end p_dtsgdttj_getsql;