使用以下数据库作为我的数据源:
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。这些表也有钱条目。
任何帮助将不胜感激!