SQL查询 - 解决重复数据

时间:2015-05-11 10:18:23

标签: sql sql-server sql-server-2012

以下是我目前使用的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自动将第一个变量添加到此项目中,作为一个新的变化线,以便我可以修改百分比完成而不影响以前的应用程序

实体关系图

enter image description here

1 个答案:

答案 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)