--庫別表
create table lm_sic_def
(
sic varchar2(10) not null,--庫別
repair_times number(3)--維修类型,结果为1或2,也可能为空,1代表1修,2代表2修。
)
--单据表
create table wip_bill_in_master
(
company varchar2(10) not null,--投递公司编号
bill_No varchar2(50) not null,--投递EK單编号
sic varchar2(10),--库别
part_No varchar2(20) not null,--物料編號
last_sign_date date not null, --投递日期
status varchar2(5) not null,--EK单的状态,C表示已完结
repair_times number(2)--维修类型,(该字段为第一题新增的字段)
)
--投递详细信息表
create table wip_in_out_info
(
sn varchar2(10) not null,--序列号
in_corp varchar2(10) not null,--投递公司编号
in_bill_no varchar2(50) not null,--投递EK单编号
in_bill_pn varchar2(20) not null,--物料编号
out_attr varchar2(5) not null,--入库状态,G为好库,B为坏库
repair_status varchar2(5) not null--板子的维修状态
)
--物料信息表
create table mgs_pn
(
part_no varchar2(20) not null,--物料编号
BU_CATEGORY varchar2(30) not null,--物料种类
division varchar2(10) not null,--物料部门,(表示A种类的物料分配到B部门,B种类的物料分配到C,C种类的物料分配到A部门,这个字段只是一个编号引用物料部门表)
)
--表关系如下面语句
select * from  wip_bill_in_master a,wip_in_out_info b,mgs_pn c
where a.company=b.in_corp and a.bill_no=b.in_bill_no and a.part_no=b.in_bill_pn and a.part_no=c.part_no
--业务说明:1.公司进行一部分维修业务,工程師所維修的板子都是由库房領出以EK单投递之后流入到工程師的手中,工程師经过維修把維修好的板子入好库,未維修好的板子入坏库。工程師被分为兩組(1修工程師,2修工程師),1修工程師對首次來的板子进行简单的維修,2修工程師对难板進行維修。
--2.投递的EK单按库别分為1修和2修,表lm_sic_def 定义所有的库别,SIC为库别,REPAIR_TIMES為維修类型。
--3.投递的单据保存在表wip_bill_in_master中,根据库別定义可以得出某一投递的EK单属于1修還是2修。其中status='C'表明此EK单以完結。表wip_in_out_info记录了投递的具体信息,每一条记录记录了一片板子。其中out_attr表明入库的状态‘G’表明入好库‘B’表明入坏库。repair_status表明该板子的維修状态。SN 为板子的序列号。
--4.表mgs_pn 記錄了所有物料的信息问题一:
EK单維修次数字段REPAIR_TIMES已經在表wip_bill_in_master中添加,但是值为空。请用兩种方式产生REPAIR_TIMES的值。
(这题也就是根据wip_bill_in_master表与lm_sic_def表的库别关系将lm_sic_def表的REPAIR_TIMES修改到wip_bill_in_master表中)
这题我已写出一条语句--解1:
update wip_bill_in_master m set m.repair_times = (select d.repair_times from lm_sic_def d where m.sic = d.sic and rownum=1)
where exists (select 1 from lm_sic_def d where d.sic = m.sic)
--第2种写法靠大家了
--解2:?问题二:
按照BU_CATEGORY,division计算2006年1至5月每月的維修达成率報表。
維修达成率=入好庫的数量/投入的总数
{计算1修2修投递的EK单且EK单已完結,時間按LAST_SIGN_DATE(wip_bill_in_master)計算,wip_in_out_info.repair_status in ('G','H')的板子進行统计,其他状态不計算--题2查询结果如下格式,如:
BU_CATEGORY DIVISION MONTH FIRST_RATE SECOND_RATE
  CSBU MIC 042006 83         0
  CSBU MIC 052006 8         23
  CSBU MIC 062006 7         15
  CSBU MIC 072006 73         34
  ESBU MIC 042006 76         37
  ESBU MIC 052006 72         23
  ESBU MIC 062006 73         13
  ESBU MIC 072006 74         18
  MBU MIC 042006 5         0
  MBU MIC 062006 63         0
  PBU MTC 042006 78         52
  PBU MTC 052006 78         3
  PBU MTC 062006 72         0
  PBU MTC 072006 77         0
  WBU MDS 042006 0         41
  WBU MDS 072006 0         95大神们,高分求答案在线等啊,这个业务题已经难倒我了,再搞不出来,老板就要开除我了,我Oracle才刚刚开始学,求高手...生死尽在各位手中了...

解决方案 »

  1.   

    --第2种写法靠大家了
    --解2:?     MERGE INTO wip_bill_in_master m
         USING lm_sic_def d
         ON (d.sic = m.sic)
         WHEN MATCHED THEN
         UPDATE
         SET  m.repair_times =d.repair_times;就这一个问题吗?
      

  2.   

    你这条语句我执行报:缺少关键字,是全的吗?,我Oracle才学的,麻烦写全啊
      

  3.   

    刚刚我查了一下MERGE INTO的用法,觉得语句没什么问题啊,但为什么会报缺少关键字呢?对了,我用的是Oracle8i的,谢谢你能看完我的题目帮我解答...
    哎...帖子都快沉了,都是看我问题太长了吗?,大神们,大牛们,大虾们,你们何在啊?
      

  4.   

    把表名改成(select ....... from 表) 别名
      

  5.   

    你说的是这样吗?MERGE INTO wip_bill_in_master m 
    USING (select * from lm_sic_def) d 
    ON (d.sic = m.sic) 
    WHEN MATCHED THEN 
    UPDATE 
    SET m.repair_times = d.repair_times 但还是报缺少关键字,报完后光标停在MERGE前面
      

  6.   


    merge是9I之后有的,你的问题必须得在8i上实现?