次のデータベースをデータ ソースとして使用します。
CREATE DATABASE [COS Source]
GO
USE [COS Source]
GO
CREATE TABLE [Products](
[INVENTORY_CODE] [nvarchar](50),
[PRODCAT_CODE] [nvarchar](50),
[LAST_COST] [int] NULL,
[STOCK_IND] [nvarchar](255) NULL,
CONSTRAINT piv PRIMARY KEY ([INVENTORY_CODE])
)
GO
CREATE TABLE [Sales Header](
[DOC_NUMBER] [nvarchar](50),
[TRANSTYPE_CODE] [int] null ,
[REP_CODE] [nvarchar](255) NULL,
[CUSTOMER_NUMBER] [nvarchar](50) ,
[TRANS_DATE] [datetime] NULL,
[FIN_PERIOD] [datetime] NULL,
CONSTRAINT shdc PRIMARY KEY ([DOC_NUMBER])
)
GO
CREATE TABLE [Sales Line](
[DOC_NUMBER] [nvarchar](50) FOREIGN KEY REFERENCES [Sales Header]([DOC_NUMBER]),
[INVENTORY_CODE] [nvarchar](50) FOREIGN KEY REFERENCES Products([INVENTORY_CODE]),
[QUANTITY] [float] NULL,
[UNIT_SELL_PRICE] [int] NULL,
[TOTAL_LINE_PRICE] [float] NULL,
[LAST_COST] [int] NULL,
CONSTRAINT sldcic PRIMARY KEY ([DOC_NUMBER],[INVENTORY_CODE])
)
GO
CREATE TABLE [Purchases Headers](
[SUPPLIER_CODE] [nvarchar](255) NULL,
[PURCH_DOC_NO] [nvarchar](50),
[PURCH_DATE] [datetime] NULL,
CONSTRAINT phpdn PRIMARY KEY ([PURCH_DOC_NO])
)
GO
CREATE TABLE [Purchases Lines](
[PURCH_DOC_NO] [nvarchar](50) FOREIGN KEY REFERENCES [Purchases Headers]([PURCH_DOC_NO]),
[INVENTORY_CODE] [nvarchar](50) FOREIGN KEY REFERENCES [Products]([INVENTORY_CODE]),
[QUANTITY] [float] NULL,
[UNIT_COST_PRICE] [float] NULL,
[TOTAL_LINE_COST] [float] NULL,
CONSTRAINT plpdc PRIMARY KEY ([PURCH_DOC_NO],[INVENTORY_CODE])
)
GO
そして、挿入先として次のデータベースを使用します。
CREATE DATABASE [COS Target]
GO
USE [COS Target]
GO
CREATE TABLE PRODUCT_DIM (
Product_Key int IDENTITY(1,1),
Product_Old_Key varchar(255),
Unit_Sale_Price decimal,
CONSTRAINT pk_PRODUCT_DIM PRIMARY KEY (Product_Key)
)
GO
CREATE TABLE CUSTOMER_SALES_FACT (
Cust_Sales_Fact_Key int IDENTITY(1,1),
Product_Key int,
Cost_Of_Sales decimal,
CONSTRAINT pk_CUSTOMER_SALES_FACT PRIMARY KEY (Cust_Sales_Fact_Key, Product_Key),
CONSTRAINT Customer_Sale_Fact_Product_Key FOREIGN KEY (Product_Key) REFERENCES PRODUCT_DIM(Product_Key) ON DELETE CASCADE,
)
GO
それぞれの売上原価 (COS) を計算し、[COS Source].dbo.[Sales Line]
この値を に挿入します[COS Target].dbo.[CUSTOMER_SALES_FACT].Cost_Of_Sales
。各販売ラインごとの売上原価を計算するための基本的な式は[COS Source].dbo.[Purchases Lines].[QUANTITY] * [COS Source].dbo.[Purchases Lines].[UNIT_COST_PRICE]
、 、または単に[COS Source].dbo.[Purchases Lines].[TOTAL_LINE_COST]
です。
テーブルは、次の[Product_Dim]
クエリを使用して設定されます。
Insert into dbo.PRODUCT_DIM
(
Product_Old_Key
,[Unit_Sale_Price]
)
Select distinct p.INVENTORY_CODE ,p.LAST_COST from [COS Source].dbo.Products as p
Join [COS Source].dbo.[Sales Line] as sl
on p.INVENTORY_CODE = sl.INVENTORY_CODE
Join [COS Source].dbo.[Sales Header] sh
on sl.DOC_NUMBER = sh.DOC_NUMBER
GO
[COS Target].dbo.[CUSTOMER_SALES_FACT]
これまでのところ、入力する必要があるがまだ完了していない挿入クエリは次のとおりです。
Insert into dbo.CUSTOMER_SALES_FACT
(
[Product_Key]
,[Cost_Of_Sales]
)
Select Distinct targetProduct.Product_Key, null /*insert COS here*/from [COS Source].dbo.[Sales Line] as sl
Join [COS Source].dbo.[Sales Header] as sh
on sl.DOC_NUMBER = sh.DOC_NUMBER
Join [COS Source].dbo.Products as p
on p.INVENTORY_CODE = sl.INVENTORY_CODE
Join dbo.PRODUCT_DIM as targetProduct
on [COS Target].Product_Old_Key = p.INVENTORY_CODE
Join [COS Source].dbo.[Purchases Lines] pl
on p.INVENTORY_CODE = pl.INVENTORY_CODE
Join [COS Source].dbo.[Purchases Headers] as ph
on pl.PURCH_DOC_NO = ph.PURCH_DOC_NO
where ph.PURCH_DATE <= sh.TRANS_DATE
GO
理想的には、計算された COS を入力に使用される挿入ステートメントに配置したいと思います[COS Target].dbo.[CUSTOMER_SALES_FACT]
が、各製品に複数の購入行が存在する場合に問題が発生します。したがって、少なくとも部分的に正確な COS を作成するには、販売ラインの前に発生した購入ラインを選択する必要があります。つまり条件は
WHERE [COS Source].dbo.[Sales Header].[TRANS_DATE] >= [COS Source].dbo.[Purchases Header].[PURCH_DATE]
満たされます。
COS の計算と挿入に成功していません。
SQL Server 2008 を使用しています。テーブルにはお金のエントリもあります。
どんな助けでも大歓迎です!