在同一列的两行之间划分,并将答案存储在现有列中

时间:2017-09-18 09:07:44

标签: c# sql-server linq

我的数据库中有一个表,其中包含'price','percentage'和'ID'列。 需要使用colum'price'和'id'计算百分比列。有一个初始价格,然后是三个增加的价格,所有这些都具有相同的ID。我需要找到一个使用C#计算数据库中百分比列的方法。

我附上一张图片,以便更好地了解它应该如何。 我正在使用Linq编写一个导入系统,我已经导入了所有列,但现在我需要计算增加价格的百分比,我真的很喜欢这个。也许某人有一些关于如何解决这个问题的上帝建议。

enter image description here

更新:

public static void calculateProcentage(string id, double price, double, double percentage)
{

    var percentageQuerry = from l in db.Table
                           where l.ID == id
                            && l.Price == price && l.Percentage != percentage
                           select l;

    foreach (Table l in percentageQuerry)
    {
        //double newPercentage = (double) l.Percentage;

        //DataTable table = new DataTable();
        // int rowCount = table.Rows.Count;
        DataGridView dataGridView = new DataGridView();

        for (int i = 0; i < dataGridView.Rows.Count; i++)
        {
            if (l.Building_vigor_ID == building_vigor_id)
            {
                //var priceRows = db.V_Leases.Select(x => x.Price_sqm).ToList(); 
                // get a list of the rows of the price column

                // get a list of the rows of the price column
                var priceRows = (from r in db.Table
                                 select r.Price).ToList();

                percentage = (double)(priceRows[i] / priceRows[i + 1]);
            }
        }
    }

    try
    {
        db.SubmitChanges();
        Console.Write("Percentage updated");
        //Console.ReadKey();
    }
    catch (Exception e)
    {
        Console.WriteLine(e);
        Console.Write("Could not update percentage");
        //Console.ReadKey();
    }
}

这就是我的尝试。我低音想把它变成一个只更新列百分比的更新方法。但没有实际工作。 Linq母猪我很新,可能是这里写的一些不好的代码。

1 个答案:

答案 0 :(得分:0)

免责声明

  

我对Linq母猪很新,可能是这里写的一些不好的代码。

你的问题,以及你试图解决这个问题的方式,充满了不一致和看似矛盾的期望。

就目前而言,由于缺乏信息,您提出的问题无法解决。但是,我确实认为我理解你要解决的实际问题是什么,所以我会给你答案。但首先,让我解释一下我是如何解释你的问题的。

我对你实际问题的假设

根据我的理解,您尝试根据之前的值计算百分比。

一个更通用的例子:

PRICE     %         ID
------------------------
 100      A         1
 103      B         1
 100      C         2
 150      D         2

我的以下答案将假设这是正确的。

您的预期值也存在问题。在您的示例中,您已将19.79(与19.21相比)的百分比列为 0.3
这根本不符合逻辑。差异 3%。在百分比列中有两种不同的(可接受的)方法来表示这一点:

  1. 3,因为它以百分比表示( 3 %)
  2. 0.03,因为它表示为十进制值(3%= 0.03
  3. 您对0.3的使用毫无意义,因为我将此解释为 0.3%(选项1)或 30%(选项2)。

    为了保持一致性,我的答案将假设您需要小数值(上例中的0.03

    我假设您的数据类构造如下:

    public class Foo
    {
        public decimal Price { get; set; }
        public decimal Percentage { get; set; }
        public int ID { get; set; }
    }
    

    我不太明白你是如何使用这种方法的。您提供了三个参数(string id, double price, double, double percentage),但随后您继续按如下方式选择数据:

    var percentageQuerry = from l in db.Table
                           where l.ID == id
                            && l.Price == price && l.Percentage != percentage
                           select l;
    

    提供百分比毫无意义,然后从该百分比中选择不同的所有内容。你不知道你将获得什么数据,以什么顺序,以及找到的条目是否在你提到的百分比之前或之后。

    相反,我的回答是重新计算给定ID 的所有百分比的方法。这似乎是一个更清晰的算法。

    假设答案

    检索数据

    你的尝试是新旧技术(LINQ,DataTable)的奇怪组合,我将完全使用LINQ,因为我觉得DataTable的使用在这里是没有根据的。

    public static void CalculatePercentagesForID(int id)
    {
        Foo[] rows = db.Table.Where(x => x.ID == id).ToArray();
    
        //... (see the next code block)
    }
    

    这简单得多。请注意,我假设您希望根据它们出现在数据库中的订单来处理这些条目。如果您需要根据其他内容(例如Foo个对象中的日期值)对其进行排序,则必须使用额外的OrderBy,例如:

    Foo[] rows = db.Table.Where(x => x.ID == id).Orderby(x => x.DateCreated).ToArray();
    

    处理数据

    重要的是要注意,百分比是从两个(后续)行计算的。

    //The first entry is always the "base" price, therefore always 0.
    rows[0].Percentage = 0;
    
    for(int i = 1; i < rows.Length; i++)
    {
        var previous = rows[i-1];
        var current = rows[i];
    
        current.Percentage = CalculateDifferenceInPercentage(previous.Price, current.Price);
    }
    
    //TODO: save all the objects in "rows" back to the database!
    

    注意for循环如何从1开始,而不是从0开始。我们跳过第0步,因为无论如何第一个元素自动为0。 for循环只会处理第一行之后的每一行

    计算百分比

    public static Decimal CalculateDifferenceInPercentage(decimal oldPrice, decimal newPrice)
    {
        //1.The elaborate calculation 
    
        //The comments are example output when oldPrice = 19.21, newPrice = 19.79
    
        var theRatio = newPrice / oldPrice;              
        // = 1.0301...
    
        var theRatioRounded = Math.Round(theRatio,2);    
        // = 1.03
    
        var thePercentageDifference = theRatioRounded - 1;
        // = 0.03
    
        return thePercentageDifference;
    }
    

    或者,如果您想要更短(但更难阅读)的版本:

    public static Decimal CalculateDifferenceInPercentage(decimal oldPrice, decimal newPrice)
    {
        return Math.Round(newPrice / oldPrice , 2) - 1;
    }
    

    一些警告

    • 为简单起见,我省略了一些空检查,例如检查是否有任何行返回。

    • 我省略了如何在数据库中保存更新的实体,因为它与您关于计算百分比的实际问题无关。

    • 这适用于负百分比和正百分比。