所以我有两张表来存储产品的销售数据。表1列出了每种产品的最近6周销售数据,表2显示了过去12个月的销售数据。我需要找到一种比较这两个表然后生成第3个表的方法,该表将包含作为第2列的2个值与第1列中的产品Sage代码之间的差异。什么是最有效(在时间上)的方式来做这个,因为将有相当数量的产品进行比较,它只会继续增长?产品Sage代码是此处的密钥标识符。这两个表创建如下。
IF OBJECT_ID('tempdb..#Last6WeeksProductSales') IS NOT NULL DROP TABLE #Last6WeeksProductSales;
CREATE TABLE #Last6WeeksProductSales
(
CompoundSageCode varchar(200),
Value decimal(18,2)
)
INSERT INTO #Last6WeeksProductSales
SELECT [SalesOrderLine].[sProductSageCode] AS [CompoundSageCode],
SUM([SalesOrderLine].[fQtyOrdered] * [SalesOrderLine].[fPricePerUnit]) AS [Value]
FROM [SalesOrderLine]
INNER JOIN [SalesOrder] ON (SalesOrder.iSalesOrderID = SalesOrderLine.iSalesOrderID)
WHERE [SalesOrder].[dOrderDateTime] > DateAdd("ww", -6, CURRENT_TIMESTAMP)
GROUP BYsProductSageCode;
SELECT * FROM #Last6WeeksProductSales
ORDER BY CompoundSageCode;
IF OBJECT_ID('tempdb..#Last12MonthsProductSales') IS NOT NULL DROP TABLE #Last12MonthsProductSales;
CREATE TABLE #Last12MonthsProductSales
(
CompoundSageCode varchar(200),
Value decimal(18,2)
)
INSERT INTO #Last12MonthsProductSales SELECT [SalesOrderLine].[sProductSageCode] AS [CompoundSageCode],
SUM([SalesOrderLine].[fQtyOrdered] * [SalesOrderLine].[fPricePerUnit]) AS [Value]
FROM [SalesOrderLine]
INNER JOIN [SalesOrder] ON (SalesOrder.iSalesOrderID = SalesOrderLine.iSalesOrderID)
WHERE [SalesOrder].[dOrderDateTime] > DateAdd(month, -12, CURRENT_TIMESTAMP)
GROUP BY sProductSageCode;
SELECT * FROM#Last12MonthsProductSales
ORDER BY CompoundSageCode;
DROP TABLE #Last6WeeksProductSales;
DROP TABLE #Last12MonthsProductSales;
答案 0 :(得分:1)
使用视图。这样您就不必担心更新第三个表,它将反映当前信息。将视图基于一个基本的SELECT:
SELECT sixS.CompoundSageCode, (12S.value - sixS.Value)为diffValue 来自Last6WeeksProductSales sixS INNER JOIN Last12MonthsProductSales12S ON sixS.CompoundSageCode = twelveS.CompoundSageCode
(我没有测试过这段代码,但它应该是一个很好的起点。)
答案 1 :(得分:0)
通常使用FULL OUTER JOIN
来计算两个表的差异。 SQL Server可以使用所有三个物理连接运算符来实现它。应用合理的索引,运行正常。
如果可以管理它,请在两个表上创建覆盖索引,这些索引按连接键排序。这将导致高效的合并连接计划。