日期:2014-05-19  浏览次数:20637 次

请教材料采购计划表的SQL写法?
create   table   t_kc   --库存表
(
  type   varchar(20),--材料类别  
  mc       varchar(20),--材料名称
  dw       varchar(20),--材料单位
  gg       varchar(20),--材料规格
  sl       int,                 --出入库数量
  dj       decimal(13,2),--单价
  status   char(1),--出入库状态   1为入库     0为出库
  bz       varchar(50),--材料用途
  gydw   varchar(50),   --供应单位
  rq       datetime   --出入库日期
)
insert   into   t_kc   select   '标准件 ', '螺丝 ', '根 ', 'M10 ',100,1, '1 ',null, '供应部门1 ', '2007-6-1 '
insert   into   t_kc   select   '标准件 ', '螺丝 ', '根 ', 'M10 ',100,1.5, '1 ',null, '供应部门2 ', '2007-6-2 '

insert   into   t_kc   select   '标准件 ', '螺丝 ', '根 ', 'M10 ',30,1, '0 ', '车底板 ',null, '2007-6-3 '

create   table   t_bzj_zl_ys     --材料预算表
(
  type   varchar(20),   --材料类别
  name   varchar(20),   --材料名称
  dw       varchar(20),   --材料单位
  gg       varchar(20),   --材料规格
  sl       int,       --使用数量
  dj       decimal(13,2),     --材料单价
  yt       varchar(50)--用途
)
insert   into   t_bzj_zl_ys     select   '标准件 ', '螺丝 ', '根 ', 'M10 ',200,2, '车底板 '
/*
要得到材料采购计划表,按照材料类别,名称,单位,规格进行分组,格式为:

材料类别     材料名称     单位       规格           用途       计划用料数量       采购数量       最后一次入库单价       金额       最后一次供应单位       库存结余数量  
标准件           螺丝             根         M10         车底板             200                   30                           1.5                     45                 供应部门2                 170

*/
drop   table   t_bzj_zl_ys
drop   table   t_kc

------解决方案--------------------
select
a.type,
a.mc,
a.dw,
a.gg,
a.yt,
a.sl as 计划用料数量,
case when a.sl> isnull(t.sl,0) then a.sl-isnull(t.sl,0) else 0 end as 采购数量,
t.dj as 最后一次入库单价,
case when a.sl> isnull(t.sl,0) then a.sl-isnull(t.sl,0) else 0 end*isnull(t.dj,0) as 金额,
t.gydw as 最后一次供应单位,
t.sl as 库存结余数量
from t_bzj_zl_ys a left join (
select
type,mc,dw,gg,
sum(case when status=1 then sl else -sl end) as sl,
(select top 1 dj from t_kc where type=b.type and mc=t.mc and dw=b.dw and gg=b.gg and status= '1 ' order by rq desc) as sj,
(select top 1 gydw from t_kc where type=b.type and mc=t.mc and dw=b.dw and gg=b.gg and status= '1 ' order by rq desc) as gydw
from t_kc b
group by type,mc,dw,gg