首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

请问材料采购计划表的SQL写法

2012-03-09 
请教材料采购计划表的SQL写法?createtablet_kc--库存表(typevarchar(20),--材料类别mcvarchar(20),--材料

请教材料采购计划表的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
) as t
on a.type=t.type
and a.mc=t.mc
and a.dw=t.dw


and a.gg=t.gg

[解决办法]
SELECT A.type AS 材料类别,A.[name] AS 材料名称,A.dw AS 单位,A.gg AS 规格,A.yt AS 用途,A.sl AS 计划用料数量,B.dj AS 最后一次入库单价 ,A.sl-C.sl 计划用料数量, (A.sl-C.sl)*B.dj AS 金额,B.gydw AS 最后一次供应单位
,C.sl 库存结余数量
FROM t_bzj_zl_ys AS A
LEFT OUTER JOIN --最后入库信息
(SELECT * FROM t_kc AS A1 WHERE status=1 AND NOT EXISTS(SELECT 1 FROM t_kc AS B1 WHERE B1.status=1 AND B1.type=A1.type AND B1.mc=A1.mc AND B1.rq> A1.rq))
AS B ON B.type=A.type AND A.[name]=B.mc
LEFT OUTER JOIN --统计进出库数量
(SELECT type,mc,SUM(CASE status WHEN 1 THEN sl ELSE -sl END) AS sl FROM t_kc GROUP BY type,mc)
AS C ON C.type=A.type AND A.[name]=C.mc

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

select a.*, sum(case when b.status=0 then b.sl else 0 end),c.dj,sum(case when b.status=0 then b.sl else 0 end)*c.dj,c.gydw,
sum(case when b.status=0 then -b.sl else b.sl end)

from t_bzj_zl_ys a inner join t_kc b on a.type=b.type and a.name=b.mc and a.dw=b.dw and a.gg=b.gg
inner join (
select * from t_kc a where
not exists (select 1 from t_kc where a.type=type and a.mc=mc and a.dw=dw and a.gg=gg and a.rq <rq and status <> 0) and status <> 0 )c
on a.type=c.type and a.name=c.mc and c.dw=b.dw and c.gg=b.gg

group by a.type, a.name, a.dw, a.gg, a.sl, a.dj, a.yt ,c.gydw,c.dj


我理解的
[解决办法]
select
a.type,
t.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=b.mc and dw=b.dw and gg=b.gg and status= '1 ' order by rq desc) as dj,
(select top 1 gydw from t_kc where type=b.type and mc=b.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
) as t
on a.type=t.type
and a.dw=t.dw
and a.gg=t.gg
==========================
type mc dw gg yt 计划用料数量 采购数量 后一次入库单价 金额 最后一次供应单位 库存结余数量
-------- -------------------- -------------------- -------------------- -------------------------------------------------- -
标准件 螺丝 根 M10 车底板 200 30 1.50 45.00 供应部门2 170
标准件 分泵 无 单 车底板 200 170 100.00 17000.00 供应部门1 30

(2 行受影响)

热点排行