日期:2014-05-17  浏览次数:20834 次

求采购价格分表sql语句
针对某个时段内计算出单个物料平均采购价格,以比较供应商之间的供货价格差异以及物料采购的价格变化情况。报表的记录内容主要包括:起始日期、物料代码、供应商名称、订货数量、订货金额、最高价格、平均价格、最低价格、最新价格等。

现有表T 及字段分别为: BOM_CODE 物料代码, LRSL 入库数量, PRICE 单价,JE 金额,FSRQ 入库时间 ,GYS_CODE 供应商 ;请问这样的sql语句如何写?

------解决方案--------------------
SQL code

create table t(
bom_code varchar2(20),
lrsl number(19,2),
price number(19,4),
je number(19,4),
fsrq date,
gys_code varchar2(20)
);
insert into t values('物料1',200,5,1000,to_date('2012.01.01','yyyy.mm.dd'),'供应商1');
insert into t values('物料1',100,10,1000,to_date('2012.01.02','yyyy.mm.dd'),'供应商2');
insert into t values('物料1',2000,4,8000,to_date('2012.01.03','yyyy.mm.dd'),'供应商3');
insert into t values('物料1',100,3,300,to_date('2012.02.01','yyyy.mm.dd'),'供应商1');
insert into t values('物料1',300,7,2100,to_date('2012.02.02','yyyy.mm.dd'),'供应商2');
insert into t values('物料1',200,5,1000,to_date('2012.02.03','yyyy.mm.dd'),'供应商3');
insert into t values('物料2',200,5,1000,to_date('2012.04.01','yyyy.mm.dd'),'供应商1');
insert into t values('物料2',100,10,1000,to_date('2012.04.02','yyyy.mm.dd'),'供应商2');
insert into t values('物料2',2000,4,8000,to_date('2012.04.03','yyyy.mm.dd'),'供应商3');
insert into t values('物料2',100,3,300,to_date('2012.02.01','yyyy.mm.dd'),'供应商1');
insert into t values('物料2',300,7,2100,to_date('2012.02.02','yyyy.mm.dd'),'供应商2');
insert into t values('物料2',200,5,1000,to_date('2012.02.03','yyyy.mm.dd'),'供应商3');

select t.bom_code 物料代码,
    t.gys_code 供应商名称,
    min(t.fsrq) 起始日期,
    sum(t.lrsl) 订货数量,    
    sum(t.lrsl*t.price) 订货金额,--如果你的je正确,也可以sum(t.je)
    max(t.price) 最高价格,
    avg(t.price) 平均价格,
    min(t.price) 最低价格,
    max(t2.price) 最新价格
from t,
(select t1.bom_code,t1.gys_code,price from t,
(select bom_code,gys_code,max(fsrq) fsrq 
    from t group by bom_code,gys_code) t1
where t.bom_code=t1.bom_code 
    and t.gys_code=t1.gys_code and t.fsrq=t1.fsrq) t2
where t.bom_code=t2.bom_code and t.gys_code=t2.gys_code
group by t.bom_code,t.gys_code
order by t.bom_code,t.gys_code;
/

------解决方案--------------------
SQL code

--最新价格 可以采用分析函数来算,效率要高一点:(示例数据如#2)
select bom_code 物料代码
    ,gys_code 供应商名称
    ,min(fsrq) 起始日期
    ,sum(lrsl) 订货数量    
    ,sum(je) 订货金额
    ,max(price) 最高价格
    ,avg(price) 平均价格
    ,min(price) 最低价格
    ,min(price) keep (dense_rank first order by fsrq desc) 最新价格
from t
group by bom_code,gys_code;

------解决方案--------------------
亲自动手尝试了,才知道那个好