我在sql 2005中有一个表ItemTran,其中包含以下列
RowNo Item ID Period RcptQty
1 ITEM-A 2011-01 15
2 ITEM-A 2011-02 10
3 ITEM-A 2011-03 18
4 ITEM-A 2011-04 25
5 ITEM-A 2011-05 3
6 ITEM-A 2011-06 12
7 ITEM-A 2011-07 15
8 ITEM-A 2011-08 5
9 ITEM-A 2011-09 15
10 ITEM-A 2011-10 8
11 ITEM-A 2011-11 10
12 ITEM-A 2011-12 5
另一个表ItemQty包含列
Item ID Qty
ITEM-A 78
如何将ItemTran与RcptQty匹配的表格中的最后一行与ItemQty表中的表格列“Qty”一起返回。
我想要像这样的输出
4 ITEM-A 2011-04 25
5 ITEM-A 2011-05 3
6 ITEM-A 2011-06 12
7 ITEM-A 2011-07 15
8 ITEM-A 2011-08 5
9 ITEM-A 2011-09 15
10 ITEM-A 2011-10 8
11 ITEM-A 2011-11 10
12 ITEM-A 2011-12 5
我想从itemTran中获取itemQty.Qty匹配的最后一行。
基本上我想从表A中获取最后一行,并与表B进行匹配。
请帮我解决这个问题。我是sql的新手。
由于
答案 0 :(得分:1)
我假设你在ItemQty中的意思是“68”,而且你每个月都要加上数量,直到你达到那个神奇的数字。然后,您正在寻找目标数量达到的月份。我没有运行sql server,但sql应该相当接近。
此陈述假设您的确意味着总数匹配:
SELECT x.RowNo, x.Period, x.ItemID
FROM ( SELECT RowNo, Period, ItemID
,SUM(RcptQty) OVER(PARTITION BY ItemId ORDER BY ItemId, period) AS running_total
FROM ItemTran t
) x
,ItemQty q
WHERE q.Qty = x.running_total
AND q.ItemID = x.ItemID
此语句返回达到阈值之前的最后一个月:
SELECT x.ItemID, MAX(x.Period)
FROM ( SELECT RowNo, Period, ItemID
,SUM(RcptQty) OVER(PARTITION BY ItemId ORDER BY ItemId, period) AS running_total
FROM ItemTran t
) x
,ItemQty q
WHERE q.Qty <= x.running_total
AND q.ItemID = x.ItemID
GROUP BY x.ItemID
如果其他人想玩这个,这里是我使用的创建脚本:
CREATE TABLE ItemTran(RowNo int, ItemID varchar(16), Period date, RcptQty int);
INSERT INTO ItemTran VALUES(1, 'ITEM-A', '2011-01-01', 15);
INSERT INTO ItemTran VALUES(2, 'ITEM-A', '2011-02-01', 10);
INSERT INTO ItemTran VALUES(3, 'ITEM-A', '2011-03-01', 18);
INSERT INTO ItemTran VALUES(4, 'ITEM-A', '2011-04-01', 25);
INSERT INTO ItemTran VALUES(5, 'ITEM-A', '2011-05-01', 3);
INSERT INTO ItemTran VALUES(6, 'ITEM-A', '2011-06-01', 12);
INSERT INTO ItemTran VALUES(7, 'ITEM-A', '2011-07-01', 15);
INSERT INTO ItemTran VALUES(8, 'ITEM-A', '2011-08-01', 5);
INSERT INTO ItemTran VALUES(9, 'ITEM-A', '2011-09-01', 15);
INSERT INTO ItemTran VALUES(10, 'ITEM-A', '2011-10-01', 8);
INSERT INTO ItemTran VALUES(11, 'ITEM-A', '2011-11-01', 10);
INSERT INTO ItemTran VALUES(12, 'ITEM-A', '2011-12-01', 5);
CREATE TABLE ItemQty(ItemID varchar(16), Qty int);
INSERT INTO ItemQty VALUES('ITEM-A', 68);