首页 新闻 会员 周边

求一段SQL语句,难倒我两天了。

1
悬赏园豆:100 [已解决问题] 解决于 2017-03-21 19:08

现数据库有三张表,分别是Depot(仓库表,存储仓库基本信息的),Container(货位表,一个仓库可以划分为若干个货位,这个表是存储货位基本信息的),Stock(库存表,存储商品库存信息的)。仓库表和货位表是一对多的关系,既一个仓库对应多个货位。而库存表中的结构如下:
………………………………………………………………
ID 主键 自动增量
ConID 存货储位ID
GoodsID 存货商品ID
InCount 进货数量
OutCount 出货数量
LastCount 最后库存数(库存数基本以这个字段为准)
………………………………………………………………
另外,库存表是以流水的方式记录商品信息的,如商品ID为1的商品库存记录可以如下

ID  ConID GoodsID InCount OutCount LastCount
____________________________________________
1   34       1       40       0        40  
2   34       1       0        26       14
3   34       1       5         0        19
4   34       1       0        17        2
5   21       1       67       0        67
6   21       1       0        10       57
7   21       1       3         0        60
8   7         1       5         0         5
9   7         1       0         5         0

上面的数据是通过Select * From Stock Where GoodsID=1查询出来的,我们如果想查询出这个商品在某个货位上的库存数可以使用SQL语句Select Top(1) LastCount From Stock Where GoodsID=1 And ConID=21 Order By ID DESC查询,结果就是当前商品在指定货位上的库存数。这里我们得到是60,如果将条件ConID改为34,则我们得到的库存数是67,这个结果是正确的。这个SQL语句之所以加上Top(1),那是因为库存表是以流水的方式记录库存的,既最新的那条记录的LastCount字段的值才是最新的库存。现在我描述下货位表和仓库表的关系,为了简单起见,我去除无相关字段,仓库表如下:
………………………………………………………………
ID 主键 自动增量
Name 仓库名称
………………………………………………………………

货位表结构如下
………………………………………………………………
ID 主键 自动增量
Name 货位名称
DepotID 所属仓库ID
………………………………………………………………

现有仓库3个,名称分别为商品仓,成品一仓,成品二仓,其中商品仓有两个货位,分别是34和7号货位(上面我们查询1号商品库存信息中有这些货位的存货记录,见ConID列);成品一仓有一个货位,既3号货位;成品二仓也只有一个货位,既21号货位。呵呵,说了那么多了,问题终于开始了。我现在要查询出商品1在各个仓库的存货情况,根据上面我们查询库存得到的结果来看,我们可以知道商品1在商品仓的存货数量是2+0,既商品仓货位34的数量加上货位7的数量;而商品1在成品一仓的存货记录为0,成品二仓的存货记录为60。现在我需要得到如下的结果

DepotID  GoodsID  DepotName StockCount
______________________________________
  1         1       商品仓     2
  3         1      成品二仓    60

成品一仓没有商品1的存货记录,不予显示。求SQL语句,可以是一个存储过程,传入参数GoodsID获取上面的那个表。万分感谢,分不够可以加,让我见识下。

问题补充: 牧之兄写可能有点问题,参数只有一个,就是商品ID,ConID我们事先并不知道。
剑师的主页 剑师 | 初学一级 | 园豆:67
提问于:2011-04-16 09:06
< >
分享
最佳答案
0

SQL 逻辑如下:
先找出Good在不同货位的最新库存资料ID,然后通过这个ID找到最新库存资料,
最后再做Group by就可以了
---------------------------------------------------------------------------------------------------------------
select aaa.depot_id,aaa.GoodsId,aaa.depot_name,SUM(aaa.LastCount) LastCount from
(
 select Depot.depot_id,Stock.GoodsId,Depot.depot_name,Stock.LastCount
 from Stock ,
      (select MAX(id) id from stock group by ConId,GoodsId) aa,
      Container,
      Depot
    where Stock.ID=aa.Id
    and Stock.ConId=Container.ConId
    and Depot.depot_id=Container.depot_id
) aaa
group by aaa.depot_id,aaa.GoodsId,aaa.depot_name

收获园豆:100
MingQ | 菜鸟二级 |园豆:312 | 2011-04-22 10:25
其他回答(4)
0

select * from (Select Top(1) LastCount From Stock Where GoodsID=1 And ConID=21 Group By ConID Order By ID DESC) as new,depot,container where new.conID=container.conID AND container.ConID=depot.DepotID

不知道这样可不可以 ?

Survival.Sun | 园豆:267 (菜鸟二级) | 2011-04-16 09:31
And ConID=21 去掉,没注意
支持(0) 反对(0) Survival.Sun | 园豆:267 (菜鸟二级) | 2011-04-16 10:16
0

select
    depot.id depotid,
    depot.name depotname,
    stock.goodsId,
    stock.stockCount
from
    stock
    inner join container on stock.conid = container.id
    inner join depot on container. depotid=depot.id
where
    stock.id in (select max(id) from stock  where goodsid=1 group by conid)
order by
    depot.id

火凌风 | 园豆:207 (菜鸟二级) | 2011-04-16 10:24
0
select c.DepotID,
a.GoodsID ,
(
select DepotName from Depot where DepotID=c.DepotID ),
a.LCount
from
(
select (sum(incount)-sum(outcount)) as LCount,goodsid,ConID from Stock Where GoodsID=@goodsid group by conid) a,
Container c
where a.ConID=c.conid group by c.DepotID
死白的man | 园豆:2135 (老鸟四级) | 2011-04-16 20:26
0

0 0

select
    depot.id depotid,
    depot.name depotname,
    stock.goodsId,
    stock.stockCount
from
    stock
    inner join container on stock.conid = container.id
    inner join depot on container. depotid=depot.id
where
    stock.id in (select max(id) from stock  where goodsid=1 group by conid)
order by
    depot.id

丿那年丶花开 | 园豆:55 (初学一级) | 2011-04-17 12:42
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册