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

请教库存盘点表的SQL写法?

create   table   t_kc   --库存表
(
  type   varchar(20),   --材料类别
  mc       varchar(20),   --材料名称
  gg       varchar(20),   --材料规格
  dw       varchar(20),   --材料单位
  dj       decimal(13,2),   --材料单价
  sl       int,     --出入库数量
  status   char(1),   --出入库标志   0为出库,1为入库
  rq   datetime     --出入库日期
)

insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.3,100, '1 ', '2007-6-1 '
insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.3,100, '1 ', '2007-6-2 '
insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.4,100, '1 ', '2007-6-2 '

insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.3,30, '0 ', '2007-6-2 '
insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.3,20, '0 ', '2007-6-3 '
insert   into   t_kc   select   '消耗材料 ', '焊药 ', '埋弧焊 ', '公斤 ',2.4,50, '0 ', '2007-6-4 '

/*
要得到以下库存盘点表(按照材料类别,材料名称,材料规格,材料单位,材料单价进行分组统计   )

盘库日期为当天日期

材料最后入库日期为:相同类别,名称,规格,单位,单价的最后入库日期

材料类别       材料名称         材料规格         材料单位         材料单价       结余数量     结余金额       盘库日期         材料最后入库日期

消耗材料           焊药             埋弧焊                 公斤               2.3               50                 115           2007-6-26           2007-6-2

消耗材料           焊药             埋弧焊                 公斤               2.4               50                 120           2007-6-26           2007-6-2

*/
drop   table   t_kc

------解决方案--------------------
Select
*,
材料单价 * 结余数量 As 结余金额
From
(
Select
type As 材料类别,
mc As 材料名称,
gg As 材料规格,
dw As 材料单位,
dj As 材料单价,
SUM(Case status When '0 ' Then - sl Else sl End) As 结余数量,
GetDate() As 盘库日期,
Max(Case status When '0 ' Then '1900-01-01 ' Else rq End) As 材料最后入库日期
From
t_kc
Group By
type,
mc,
gg,
dw,
dj
) A

------解决方案--------------------
SELECT type as 材料类别,mc as 材料名称,gg as 材料规格,dw as 材料单位,
dj as 材料单价,
结余数量 = sum(case when status = '1 ' then sl else -sl end),
结余金额 = dj*sum(case when status = '1 ' then sl else -sl end),
盘库日期 = getdate(),
材料最后入库日期 = max(case when status = '1 ' then rq end)
FROM t_kc