2013-11-26 75 views
0

我需要更新一个表,并依次计算才能得到正确的最终结果。 但我认为当我执行下面的语句时,它会同时运行所有计算,导致错误地计算结果。我需要的是让这样的事情:SQL多次计算顺序+总结值

OF =订单

这时旁边

日报X /集装箱尺寸=看板卡

号(+ MCT +交通+安全)

每日X

综述的例如3.0的 “看板卡片的编号” 的结果成为4

然后下一

作者X每日/集装箱尺寸=运行线

综述 “运行线” 的例如3.0的结果成为4

然后下一

运行线X集装箱尺寸=土地面积

然后下一

号看板X集装箱尺寸=最大库存

Then next

(No.的看板 - 运行线)X集装箱尺寸=触发1

然后下一

(的看板号 - 运行线 - 1)X集装箱尺寸=触发2

然后下一

(号看板 - 运行线 - 2)X集装箱尺寸=触发3

最后

每日X(0.5 X(+ MCT OF)+交通+安全)=平均INVE ntory

SELECT [Part Num], Daily, [O.F], [Order], MCT, Transit, [Safety], [Container Size], [No. of Kanban Card], [Run Line], [Lot Size], [Max. Inventory], [Trigger 1], [Trigger 2], [Trigger 3], [Avg. Inventory], 
(Daily * [O.F]) AS [Order], 
(Daily * ([O.F] + MCT + Transit + [Safety])/[Container Size]) AS [No. of Kanban Card], 
([O.F] * Daily/[Container Size]) AS [Run Line], 
([Run Line] * [Container Size]) AS [Lot Size], 
([No. of Kanban Card] * [Container Size]) AS [Max. Inventory], 
(([No. of Kanban Card] - [Run Line]) * [Container Size]) AS [Trigger 1], 
(([No. of Kanban Card] - [Run Line] - 1) * [Container Size]) AS [Trigger 2], 
(([No. of Kanban Card] - [Run Line] - 2) * [Container Size]) AS [Trigger 3], 
(Daily * (0.5 * ([O.F] + MCT) + Transit + [Safety])) AS [Avg. Inventory] 
FROM SuperMarketTest 

回答

0

你可以选择每次计算为子查询(或多个可读作为一个公共表表达式),然后立足于子查询或先前CTE下一次计算。

另一个选项可能更简单,就是将所有计算作为多个更新语句逐个进行。

这里是反过来的CTE的例子...

;WITH c1 AS (
SELECT 
    [Part Num], 
    Daily, 
    [O.F], 
    [Order], 
    MCT, 
    Transit, 
    [Safety], 
    [Container Size], 
    [No. of Kanban Card], 
    [Run Line], 
    [Lot Size], 
    [Max. Inventory], 
    [Trigger 1], 
    [Trigger 2], 
    [Trigger 3], 
    [Avg. Inventory] 
FROM SuperMarketTest 
), c2 AS 
(
SELECT 
    [Part Num], 
    Daily, 
    [O.F], 
    (Daily * [O.F]) AS [Order], 
    MCT, 
    Transit, 
    [Safety], 
    [Container Size], 
    (Daily * ([O.F] + MCT + Transit + [Safety])/[Container Size]) AS [No. of Kanban Card], 
    [Run Line], 
    [Lot Size], 
    [Max. Inventory], 
    [Trigger 1], 
    [Trigger 2], 
    [Trigger 3], 
    [Avg. Inventory] 
FROM c1 
) , c3 AS 
(
SELECT 
    [Part Num], 
    Daily, 
    [O.F], 
    [Order], 
    MCT, 
    Transit, 
    [Safety], 
    [Container Size], 
    [No. of Kanban Card], 
    ([O.F] * Daily/[Container Size]) AS [Run Line], 
    [Lot Size], 
    ([No. of Kanban Card] * [Container Size]) AS [Max. Inventory] 
    [Trigger 1], 
    [Trigger 2], 
    [Trigger 3], 
    [Avg. Inventory] 
FROM c2 
) 
SELECT 
    [Part Num], 
    Daily, 
    [O.F], 
    [Order], 
    MCT, 
    Transit, 
    [Safety], 
    [Container Size], 
    [No. of Kanban Card], 
    [Run Line], 
    [Lot Size], 
    [Max. Inventory] 
    (([No. of Kanban Card] - [Run Line]) * [Container Size]) AS [Trigger 1], 
    (([No. of Kanban Card] - [Run Line] - 1) * [Container Size]) AS [Trigger 2], 
    (([No. of Kanban Card] - [Run Line] - 2) * [Container Size]) AS [Trigger 3], 
    (Daily * (0.5 * ([O.F] + MCT) + Transit + [Safety])) AS [Avg. Inventory] 
FROM c3