2017-06-12 45 views
0

我有包含不同類型產品的當前庫存的表格,它們的位置和成本。從視圖中自動插入數據

我打算創建一個視圖,將如下,以保持每每天我的股票歷史上的每一天結束結合這樣的數據:

opening stock (of yesterday) --- Sales ---- Closing Stock (today) 

但我不知道是什麼是實現這一點並避免數據重複的最佳方式。我正在使用SQL Server,但我對它不是很熟悉。

+0

你說的*避免重複意味着合併過程*?視圖不會將數據添加到您的數據庫,並且如果您嘗試返回在三個不同時間點出現的股票,如果同時出現三個相同的項目,則應該*重複* – iamdave

+0

我的意思是當我從表中獲取數據進入視圖,它將看起來像是特別針對銷售的交易歷史記錄,所以當我從視圖中獲取這些數據到我將維護股票歷史的新表中時,我不希望它每次都記錄所有記錄。我希望這是明確的?! –

+0

然後使用'where'子句......?我個人建議你在這裏考慮一下你的數據庫設計,這聽起來很差,並且違反了標準的標準化原則。 – iamdave

回答

0

我可以通過以下步驟說明,我假設你的表是用主鍵定義的,以消除重複的記錄更新。

CREATE TABLE TransactionHistory(
       ProductNo varchar(10) not null 
       ,Product_name varchar(100) not null 
       ,TransactionDate Date 
       ,SalesValue float 
CONSTRAINT [Pk_product] PRIMARY KEY CLUSTERED 
(
    productno asc 
    ,product_name asc 
    ,transactionDate asc 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

- 創建視圖現在將數據插入到表

Create View Vw_TransactionHistory 
as 

select 
     ProductNo 
     ,Product_name 
     ,TransactionDate 
     ,SalesValue 

from salesTable 

where transactiondate = getdate()-15 


GO 

因此,鑑於着眼於過去15天的數據,或者你可以將其更改爲GETDATE()或GETDATE() - 1

現在--3rd一步,創造出更新的記錄或插入新記錄

CREATE PROCEDURE usp_transactionHistory 
AS 
BEGIN 
    MERGE dbo.TransactionsHistory AS TARGET 
    USING Vw_TransactionHistory AS SOURCE 
     ON (
       TARGET.ProductNo = SOURCE.ProductNo 
       AND TARGET.Product_name = source.Product_name 
       AND TARGET.TransactionDate = SOURCE.TransactionDate 
       AND TARGET.SalesValue = SOURCE.SalesValue 
       ) 
    WHEN MATCHED 
     THEN 
      UPDATE 
      SET TARGET.ProductNo = SOURCE.ProductNo 
       ,TARGET.Product_name = source.Product_name 
       ,TARGET.TransactionDate = SOURCE.TransactionDate 
       ,TARGET.SalesValue = SOURCE.SalesValue 
    WHEN NOT MATCHED BY TARGET 
     THEN 
      INSERT (
       ProductNo 
       ,Product_name 
       ,TransactionDate 
       ,SalesValue 
       ) 
      VALUES (
       SOURCE.ProductNo 
       ,SOURCE.Product_name 
       ,SOURCE.TransactionDate 
       ,SOURCE.SalesValue 
       ); 
END 
GO