0
我有包含不同類型產品的當前庫存的表格,它們的位置和成本。從視圖中自動插入數據
我打算創建一個視圖,將如下,以保持每每天我的股票歷史上的每一天結束結合這樣的數據:
opening stock (of yesterday) --- Sales ---- Closing Stock (today)
但我不知道是什麼是實現這一點並避免數據重複的最佳方式。我正在使用SQL Server,但我對它不是很熟悉。
我有包含不同類型產品的當前庫存的表格,它們的位置和成本。從視圖中自動插入數據
我打算創建一個視圖,將如下,以保持每每天我的股票歷史上的每一天結束結合這樣的數據:
opening stock (of yesterday) --- Sales ---- Closing Stock (today)
但我不知道是什麼是實現這一點並避免數據重複的最佳方式。我正在使用SQL Server,但我對它不是很熟悉。
我可以通過以下步驟說明,我假設你的表是用主鍵定義的,以消除重複的記錄更新。
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
你說的*避免重複意味着合併過程*?視圖不會將數據添加到您的數據庫,並且如果您嘗試返回在三個不同時間點出現的股票,如果同時出現三個相同的項目,則應該*重複* – iamdave
我的意思是當我從表中獲取數據進入視圖,它將看起來像是特別針對銷售的交易歷史記錄,所以當我從視圖中獲取這些數據到我將維護股票歷史的新表中時,我不希望它每次都記錄所有記錄。我希望這是明確的?! –
然後使用'where'子句......?我個人建議你在這裏考慮一下你的數據庫設計,這聽起來很差,並且違反了標準的標準化原則。 – iamdave