以下是我目前使用的2个表格,其中包含一些示例数据:
Finances
FinanceID Variation Total
1 0 £1,000.00
5 1 £250.00
24 2 £500.00
项目可以包含多个财务,变更0是原始订单,此后的每个财务行比前一个更大。
Application
ApplicationID ApplicationNumber PercentageComplete Value
5 1 20% £200.00
17 2 50% £300.00
35 3 75% £250.00
91 4 90% £150.00
上面的应用程序表引用了原始财务行,而不是变体
以下是我的问题的一个例子,我将在以下详细解释:
Application 5 PercentageComplete Value
Contains no Variations
Application 17 PercentageComplete Value
Contains Variation 1 40% £100.00
Application 35 PercentageComplete Value
Contains Variation 1 100% £150.00
Contains Variation 2 25% £125.00
Application 91 PercentageComplete Value
Contains Variation 1 100% £0.00
Contains Variation 2 60% £175.00
因此,使用上面的示例,用户将手动将变体1添加到应用程序17,输入其完成百分比,并且该值将自动计算
我的问题:
现在对于应用程序35,我希望自上一个应用程序的变体行自动添加到此一个,但是当编辑信息时(现在是100%),我不希望这会影响应用程序17.
是我唯一的选择,可以保持每个变异线的数据重复,还是有人能帮助我的更有效的方法?我也尝试过写一个查询来做这件事,这比我预想的要困难得多,所以如果这是唯一的方法,一些指针或一个例子会有很大的帮助。
对于Query,我创建了这个表来尝试它:
VariationLine ApplicationID VariationID PreviousPercentage NewPercentage Value
1 17 1 0% 40% £100.00
2 35 1 40% 100% £150.00
3 35 2 0% 25% £125.00
4 91 1 100% 100% £0.00
5 91 2 25% 60% £175.00
如果我要添加第5个应用程序,那么我需要为新项目插入2个先前的VariationLines(4和5)
我的问题的简短版本:
我有4个应用程序......第1个没有变化,只有自己的成本。对于第二个应用程序,用户手动添加变量1,完成百分比为40%(£100.00)......当用户创建第三个应用程序时,我希望SQL Server自动将第一个变量添加到此项目中,作为一个新的变化线,以便我可以修改百分比完成而不影响以前的应用程序
实体关系图
答案 0 :(得分:1)
我创建了一个视图,首先根据更改的列确定以前的VariationLines,并且在添加新的Application时,下面的视图将根据以前的Application选择所有的Applications Variations。如果应用程序是第一个,那么最初不会添加任何内容,用户可以选择在任何时间点向应用程序添加变体。
CREATE VIEW NextApplicationVariations AS
SELECT variationid,
(SELECT TOP (1) applicationid
FROM dbo.applications
ORDER BY changedate DESC) AS ApplicationID,
(SELECT TOP (1) applicationnumber
FROM dbo.applications
ORDER BY changedate DESC) AS ApplicationCounter,
variationpercentage,
0 AS VariationValue,
variationpercentage AS PreviousPercentage,
projectreference,
totalvariationvalue,
0 AS VariationRetention
FROM dbo.variationline
WHERE ( projectreference = (SELECT TOP (1) projectreference
FROM dbo.projectcosts
ORDER BY changedate DESC) )
AND ( applicationcounter = (SELECT TOP (1) applicationnumber
FROM dbo.applications
ORDER BY changedate DESC) - 1 )
现在剩下要做的就是根据这个视图插入新行,现在这个查询在视图中运行,我可以使用查询中的NOT EXISTS来确定最新的Application是否自动添加了VariationLines
--INSERT PREVIOUS VARIATIONS INTO NEW APPLICATIONS
INSERT INTO variationline
(variationid,
applicationid,
applicationcounter,
variationpercentage,
variationvalue,
previouspercentage,
projectreference,
totalvariationvalue,
variationretention)
SELECT nextvariationline.variationid,
nextvariationline.applicationid,
nextvariationline.applicationcounter,
nextvariationline.variationpercentage,
nextvariationline.variationvalue,
nextvariationline.previouspercentage,
nextvariationline.projectreference,
nextvariationline.totalvariationvalue,
nextvariationline.variationretention
FROM nextvariationline
WHERE NOT EXISTS (SELECT *
FROM variationline
WHERE nextvariationline.applicationid =
variationline.applicationid)