1

データベースには 2 つのビューがあります。これらの構造は次のとおりです。

表 1 (在庫製品エントリ) :

---------------------------------------
| Date     | Product     | Quantity   |
---------------------------------------
|2013-06-06| Procuct001  | 40         |
---------------------------------------

表 2 (ストック製品の出力) :

---------------------------------------
| Date     | Product     | Quantity   |
---------------------------------------
|2013-06-07| Procuct001  | 15         |
---------------------------------------
|2013-06-08| Procuct001  | 5          |
---------------------------------------

在庫のすべての動き (エントリまたは出力) を保存する 3 番目のビュー (またはテーブル) が必要ですが、入力または取得された数量ではなく、差額 (つまり、在庫の残高) を保存したいと考えています。この場合、新しいテーブルには以下が含まれている必要があります。

表3(ストックバランス):

---------------------------------------
| Date     | Product     | Quantity   |
---------------------------------------
|2013-06-06| Procuct001  | 40         |
---------------------------------------
|2013-06-07| Procuct001  | 25         |
---------------------------------------
|2013-06-07| Procuct001  | 20         |
---------------------------------------

SP1 を適用した SQL Server 2012 を使用しています。

4

1 に答える 1

0

ROW_NUMBER共通テーブル式を使用して、リストをシードするために利用するオプションの 1 つを次に示します (製品ごとにグループ化)。

with cte as (
  select dt, product, quantity, row_number() over (partition by product order by dt) rn
  from (
    select * from t1
    union
    select * from t2
    ) t
  ) 
select c.dt, c.product,
  c2.quantity - coalesce(sum(c3.quantity),0) runningty 
from cte c
  inner join (
    select product, quantity
    from cte
    where rn = 1) c2 on c.product = c2.product
  left join cte c3 on c.product = c3.product and c3.rn <= c.rn and c3.rn <> 1
group by c.dt, c.product, c2.quantity

データによっては、「最初の」レコードを取得するために追加の内部結合が必要ない場合があります。代わりに、次のようなものを使用できます。

with cte as (
  select dt, product, quantity, row_number() over (partition by product order by dt) rn
  from (
    select * from t1
    union
    select * from t2
    ) t
  ) 
select c.dt, c.product,
  max(c.quantity) over (partition by c.product) - coalesce(sum(c3.quantity),0) runningty 
from cte c
  left join cte c3 on c.product = c3.product and c3.rn <= c.rn and c3.rn <> 1
group by c.dt, c.product, c.quantity
于 2013-06-17T03:24:46.050 に答える