求个SQL语句,我认为特复杂,逻辑性很强,不过高手们肯定会写!

现数据库有三张表,分别是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获取商品的那个表。万分感谢,分

不够可以加,让我见识下。
我CAO,百度藏龙卧虎啊,那么多牛人,我一个个测。

注意这里口误,最后一段“传入参数GoodsID获取商品的那个表。”应为“传入参数GoodsID获取上面的那个表。”。该死的拼音输入法。

CREATE TABLE Depot(
ID INT IDENTITY(1, 1) PRIMARY KEY,
Name VARCHAR(10)
);
go

INSERT INTO Depot
SELECT '商品仓' UNION ALL
SELECT '成品一仓' UNION ALL
SELECT '成品二仓';
go

-- 为了造测试数据,这里不自增了
CREATE TABLE Container(
ID INT PRIMARY KEY,
Name VARCHAR(20),
DepotID INT
);

INSERT INTO Container
SELECT 21, '21号仓位', 3 UNION ALL
SELECT 34, '34号仓位', 1 UNION ALL
SELECT 7, '7号仓位', 1;
go

CREATE TABLE Stock(
ID INT IDENTITY(1,1) PRIMARY KEY,
ConID INT,
GoodsID INT,
InCount INT,
OutCount INT,
LastCount INT
);
go

INSERT INTO Stock
SELECT 34, 1, 40, 0 , 40 UNION ALL
SELECT 34, 1, 0 , 26, 14 UNION ALL
SELECT 34, 1, 5 , 0 , 19 UNION ALL
SELECT 34, 1, 0 , 17, 2 UNION ALL
SELECT 21, 1, 67, 0 , 67 UNION ALL
SELECT 21, 1, 0 , 10, 57 UNION ALL
SELECT 21, 1, 3 , 0 , 60 UNION ALL
SELECT 7 , 1, 5 , 0 , 5 UNION ALL
SELECT 7 , 1, 0 , 5 , 0
go

-- 上面是测试表/数据

-- 下面是查询
WITH
stockCTE
AS
(
SELECT
Depot.ID AS DepotID,
Container.ID AS ConID,
Stock.GoodsID,
Depot.Name AS DepotName,
Stock.ID AS StockID,
LastCount
FROM
Depot
JOIN Container
ON (Depot.ID = Container.DepotID)
JOIN Stock
ON (Container.ID = Stock.ConID)
)
SELECT
DepotID,
GoodsID,
DepotName,
SUM(LastCount) AS StockCount
FROM
stockCTE
WHERE
( SELECT
COUNT(1)
FROM
stockCTE topn
WHERE
topn.DepotID = stockCTE.DepotID
AND topn.ConID = stockCTE.ConID
AND topn.GoodsID = stockCTE.GoodsID
AND stockCTE.StockID < topn.StockID
) < 1
GROUP BY
DepotID,
GoodsID,
DepotName

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

(2 行受影响)
温馨提示:答案为网友推荐,仅供参考
第1个回答  2011-04-16
没测试啊,楼主将就下,或者贴测试数据脚本出来 :)
借 wangzhiqing999的测试数据修改了下
SELECT B.DEPOTID,A.GOODSID,B.NAME,SUM(A.LASTCOUNT)
FROM STOCK A
LEFT JOIN
(SELECT M.ID AS CID,N.ID,M.DEPOTID,N.NAME FROM CONTAINER M LEFT JOIN DEPOT n
ON M.DEPOTID=N.ID) B
ON A.CONID = B.CID
WHERE NOT EXISTS(SELECT 1 FROM STOCK WHERE CONID=A.CONID AND ID>A.ID)
AND A.GOODSID=1
GROUP BY B.DEPOTID,A.GOODSID,B.NAME
结果
-----------

DEPOTID GOODSID NAME
----------- ----------- ---------- -----------
3 1 成品二仓 60
1 1 商品仓 2

(2 行受影响)
第2个回答  2011-04-16
select d.id deoptid,t.goodsid,d.[name],t.stockcount
from Container c join depot d on c.depotid=d.id
join (select conid,goodsid,sum(incount-outcount) StockCount from stock group by conid,conid,goodsid)
t on c.id=t.conid

我靠刚一写完就看到这么多答案了,不过测试了下都在报错 各位还是要注意下要求
第3个回答  2011-04-16
declare @Depot TABLE(ID int, name varchar(50));
declare @Container TABLE(ID int, DepotID int);
declare @stock TABLE(ID int, ConID int, GoodsID int, InCount int, OutCount int, LastCount int);

INSERT INTO @Depot VALUES(1, 'M');
INSERT INTO @Depot VALUES(2, 'P_1');
INSERT INTO @Depot VALUES(3, 'P_2');

INSERT INTO @Container VALUES(3, 2);
INSERT INTO @Container VALUES(21, 3);
INSERT INTO @Container VALUES(7, 1);
INSERT INTO @Container VALUES(34, 1);

INSERT INTO @stock VALUES(1, 34, 1, 40, 0, 40);
INSERT INTO @stock VALUES(2, 34, 1, 0, 26, 14);
INSERT INTO @stock VALUES(3, 34, 1, 5, 0, 19);
INSERT INTO @stock VALUES(4, 34, 1, 0, 17, 2);
INSERT INTO @stock VALUES(5, 21, 1, 67, 0, 67);
INSERT INTO @stock VALUES(6, 21, 1, 0, 10, 57);
INSERT INTO @stock VALUES(7, 21, 1, 3, 0, 60);
INSERT INTO @stock VALUES(8, 7, 1, 5, 0, 5);
INSERT INTO @stock VALUES(9, 7, 1, 0, 5, 0);
------------- 前面都是准备数据,真正的查询从这里开始。
SELECT c.DepotID, t.Mid AS GoodsID, s.LastCount, d.name
FROM
(SELECT MAX(ID) AS Mid, ConID FROM @stock group by ConID) t
INNER JOIN @stock s ON t.Mid = s.ID AND s.LastCount>0
INNER JOIN @Container c ON s.ConID = c.ID
INNER JOIN @Depot d ON c.DepotID = d.ID
第4个回答  2011-04-16
既然看完了这么长的问题不写点不行啊,话说我也不知道行不行
select DepotID,max(GoodsID),max(DepotName),sum(LastCount)
from Container,Stock,Depot where ConID=Container.ID and Depot.ID=DepotID
and Stock.ID in (select max(ID) from Stock where GoodsID=1 group by ConID)
group by DepotID
相似回答