【精】▼▼▼百分大讨论,高手进来讨论解决,菜鸟进来学学!来者有分!请置顶▼▼▼【精】

dcren521 2004-09-30 11:40:19
有两个表,一个是物品表,一个是价格表

物品表(goods)字段及代表性记录如下(id 物品序号,name物品名称)
---------------------------------------
id name
---------------------------------------
1 西门子M55
2 诺基亚3100
……

另一个是价格表(price)字段及代表性记录如下(id物品序号,providerId供货商代号,price价格)

--------------------------------------------
id provider      price
--------------------------------------------
1 a 100
1 b 120
2 a 150
2 b 110
……
第三个表:供货商表(provider)(字段providerId 供货商代码 providerName 供货商名称 )
------------------------------------------------
providerId providerName
-----------------------------------------------
a 北京供货商
b 上海供货商
c 南京供货商
……
--

有几点说明价格表的中供应商不一定只有两个数量不定

要求在web页面显示如下对比数据(注:除商品序号一列及商品名称一列外,其它供货商列根据实际情况显示,也就是说不一定只有北京供货商及上海供货商,要求有多少供货商显示多少,目的是为了对比方便一目了然)
-------------------------------------------------------------------
商品序号 |  商品名称  | 北京供货商  | 上海供货商 | 南京供货商……
-------------------------------------------------------------------
1       西门子M55   100 120     无
2 诺基亚3100 150 110     无 
……
大家看看,应该怎么解决。
 
...全文
416 45 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhaokeke2004 2004-10-12
  • 打赏
  • 举报
回复
学习
dcren521 2004-10-12
  • 打赏
  • 举报
回复
本人本着来者有分的原则进行结贴,根据功劳苦劳兼顾热心程度给分,最终采用的是Croatia(Croatia) 的思路对实际的问题(自然比我提问的问题要复杂许多倍的),本想给Croatia(Croatia) 101分,但帖子无法加分,所以我会另开贴给他分的!对于其他朋友给我的帮助我表示感谢!谢谢大家了!分数不一定让人人满意,但我想分数不是很重要吧!再一次表示感谢!

Croatia(Croatia)领分地址:

http://community.csdn.net/Expert/topic/3446/3446949.xml?temp=.3111383
dcren521 2004-10-10
  • 打赏
  • 举报
回复
大家再看看,看看还有没有别的办法!帖出吧,共同学习,一起交流呀!
解决问题不是最终目的,重要的是可以从中真正学到东西!或者从中学到解决问题的多种方法以便在不同的情况下,选择更为合适的方法!
bzszp 2004-10-09
  • 打赏
  • 举报
回复
:)
你目前只能发100分的贴子
达到4个三角以上才可以发200分的贴子。
dcren521 2004-10-09
  • 打赏
  • 举报
回复
另外再请教一下,我看别人能给帖子加分,使得分数走超过100分,为什么我不行?
dcren521 2004-10-09
  • 打赏
  • 举报
回复
大家再看看,看看还有没有别的办法!帖出吧,共同学习,一起交流呀!
解决问题不是最终目的,重要的是可以从中真正学到东西!或者从中学到解决问题的多种方法以便在不同的情况下,选择更为合适的方法!我会给帖子加分的!
dcren521 2004-10-09
  • 打赏
  • 举报
回复
谢谢,原来还有这样的讲究呢!
tigertou 2004-10-01
  • 打赏
  • 举报
回复
高手亚,我还是初学者列!

ITpassport 2004-09-30
  • 打赏
  • 举报
回复
有个笨办法,不知道可不可以试一下,你可以把相应的值符给一个网格,然后再根据需要付给另一个网格
dcren521 2004-09-30
  • 打赏
  • 举报
回复
TO liuyi8903(西西) :虽然看不懂,但依然十分感谢!
liuyi8903 2004-09-30
  • 打赏
  • 举报
回复
我给你提供一个例子.方法不太好.但是还管用.
第一个存储过程是用来获取表头的.第二个是获取表内容的.也就是数据.
两个过程都是返回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;
Croatia 2004-09-30
  • 打赏
  • 举报
回复
楼上的,他这么些,因为,他的部分code,已经定死了,所以才用decode,这个意见,上面已经有人说过了。
天哥-天行健 2004-09-30
  • 打赏
  • 举报
回复
看看这位高手beckhambobo(beckham) 在别的帖子的回复,希望对你有帮助,我也继续关注:




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 姓名




JeromeLiu 2004-09-30
  • 打赏
  • 举报
回复
JeromeLiu(烛光):
你根本就没有仔细看过我写的东西,假如你认真看了,或者,分析过,我想,你就不会这么回答我了。
--
是的,我没有仔细看过,我只是针对楼主的查询结果,而不是说在前台程序中处理,所有很抱歉。
dcren521 2004-09-30
  • 打赏
  • 举报
回复
楼主,我想知道,我写的东西,你明白了吗?对你有帮助吗?

我看过CSDN里面的人的一些做法,我只是给你换一个思路。很多的时候,问题的解决方法不是一个,条条大路通罗马。

to Croatia(Croatia):谢谢,有帮助,是这样的,我实现的问题比提出来的要复杂许多,我提问习惯把实际的问题简单化,以便大家在更短的时间内知道我想问什么……我现在正在整理您的方法,以及大家提供的思路……看看用什么方法更适合于这个复杂的问题。


Croatia 2004-09-30
  • 打赏
  • 举报
回复
TO: lotusfromwater(出水芙蓉)

其实,转换放在什么地方,这个问题,我看需要再看待了,他们写在ORACLE的过程里面,我只不过是写在了JSP或者JAVA里面。

我喜欢把这样的简单的显示逻辑,做到后者里面。

看你喜欢了。
bzszp 2004-09-30
  • 打赏
  • 举报
回复
没有什么关系啦
解决问题最重要。
天哥-天行健 2004-09-30
  • 打赏
  • 举报
回复
请问:Croatia(Croatia)
能不能借鉴一下Croatia(Croatia) 他们的思路直接实现如楼主
-------------------------------------------------------------------
商品序号 |  商品名称  | 北京供货商  | 上海供货商 | 南京供货商……
-------------------------------------------------------------------
1       西门子M55   100 120     无
2 诺基亚3100 150 110     无 
……
这样的查询结果!这样是不更好一点,是不是就可以在页面上不必要判断,以及换行的什么的,我很菜,以上意见,请各们高手想想!我也将密切关注!
天哥-天行健 2004-09-30
  • 打赏
  • 举报
回复
关注!
Croatia 2004-09-30
  • 打赏
  • 举报
回复
楼主,我想知道,我写的东西,你明白了吗?对你有帮助吗?

我看过CSDN里面的人的一些做法,我只是给你换一个思路。很多的时候,问题的解决方法不是一个,条条大路通罗马。
加载更多回复(25)

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧