2

次の列を持つ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

ItemQty テーブルのテーブル列「Qty」を使用して RcptQty と一致するテーブル ItemTran から最後の行を返すにはどうすればよいですか。

私はこのような出力が欲しい

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.Qty が一致する ItemTran から最後の行をフェッチしたい。

基本的に、テーブル B と一致するサマリーを使用して、テーブル A から最後の行を取得したいと考えています。

これについて私を助けてください。私はSQLに非常に慣れていません。

ありがとう

4

1 に答える 1

1

ItemQty で「68」を意味し、そのマジック ナンバーに到達するまで毎月の数量を合計していると仮定します。次に、その目標数量が達成された月を探します。私はSQLサーバーを実行していませんが、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);
于 2011-12-24T21:41:46.213 に答える