объединение данных из двух таблиц в базе данных для получения общей суммы (C #) - PullRequest
0 голосов
/ 01 января 2019

Я новичок в базах данных, и мне нужна помощь.У меня есть база данных с двумя таблицами ([tb_TotalH], [tb_PricePerH]).В первой таблице [tb_TotalH] показано общее количество часов в день, а во второй таблице [tb_PricePerH] указаны цены часа с датой их создания.enter image description here

Мне нужно рассчитать общую сумму (умножить цену за час в час).Но хитрость в том, что цена часа не фиксирована, она меняется, и мне нужна цена в период, когда были сделаны рабочие часы.И мне также нужно получить цену, когда я делаю запрос на фильтр дат, чтобы получить цену в ярлыке. Я понятия не имею, как начать это! Вот мой код, который я сделал до сих пор:

     SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=|DataDirectory|\Database1.mdf;Integrated Security=True");

    void DisplayData()
    {

        con.Open();
        DataTable dt = new DataTable();
        sda = new SqlDataAdapter("select * from tb_TotalH", con);
        sda.Fill(dt);
        dataGridView1.DataSource = dt;
        con.Close();

        dataGridView1.AllowUserToAddRows = false;
        dataGridView1.AutoResizeColumns();
    }


    void BetweenDates()
    {
        DateTime dtFrom = Convert.ToDateTime(dtp1.Value);
        DateTime dtTo = Convert.ToDateTime(dtp2.Value);
        SqlDataAdapter mda = new SqlDataAdapter("select * from DailyDataEntry where Date_H between '" + dtFrom.ToShortDateString() + "' and '" + dtTo.ToShortDateString() + "' ", con);



        System.Data.DataSet ds = new System.Data.DataSet();
        con.Open();
        mda.Fill(ds, "root");
        dataGridView1.DataSource = ds.Tables["root"];
        dataGridView1.Refresh();
        con.Close();
    }

    void getPrice()
    {
        SqlDataReader rdr = null;
        SqlCommand cmd = null;

        con.Open();


        string CommandText = "SELECT Price, Tax FROM tb_PricePerH WHERE Date_M = @date"; 
        cmd = new SqlCommand(CommandText);
        cmd.Connection = con;

        cmd.Parameters.AddWithValue("@date", "4/22/2018");  

        rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
            lbl1.Text = Convert.ToDouble(rdr["PricePerHour"].ToString());
            lbl2.Text = Convert.ToDouble(rdr["Tax"].ToString());
        }


        con.Close();
    }

1 Ответ

0 голосов
/ 01 января 2019

Я пытался смоделировать ваш сценарий с помощью List.

var tablePricePerHours = new List<TablePricePerHours>
    {
        new TablePricePerHours{ Price = 10, Tax = 19, Date = new DateTime(2018,1,5)},
        new TablePricePerHours{ Price = 10.5, Tax = 21.5, Date = new DateTime(2018,4,22)},
        new TablePricePerHours{ Price = 11, Tax = 22.5, Date = new DateTime(2018,6,19)},
        new TablePricePerHours{ Price = 11.5, Tax = 23, Date = new DateTime(2018,10,30)},
        new TablePricePerHours{ Price = 12, Tax = 23.2, Date = new DateTime(2018,11,1)}
    };

    var tableTotalHours = new List<TableTotalHours>
    {
        new TableTotalHours{ Date = new DateTime(2018,02,15), TotalHours = 5},
        new TableTotalHours{ Date = new DateTime(2018,02,19), TotalHours =10},
        new TableTotalHours{ Date = new DateTime(2018,02,25), TotalHours = 8},
        new TableTotalHours{ Date = new DateTime(2018,03,29), TotalHours = 7.5},
        new TableTotalHours{ Date = new DateTime(2018,07,05), TotalHours = 9},
        new TableTotalHours{ Date = new DateTime(2018,07,06), TotalHours = 1.5},
        new TableTotalHours{ Date = new DateTime(2018,07,07), TotalHours = 12},
        new TableTotalHours{ Date = new DateTime(2018,10,22), TotalHours = 10},
        new TableTotalHours{ Date = new DateTime(2018,10,22), TotalHours = 10},
        new TableTotalHours{ Date = new DateTime(2018,11,1), TotalHours = 8},
        new TableTotalHours{ Date = new DateTime(2018,12,21), TotalHours = 8.5},
        new TableTotalHours{ Date = new DateTime(2018,12,22), TotalHours = 9},
    };

Где TablePricePerHours и TableTotalHours определены как

public class TableTotalHours
{
    public int Id {get;set;}
    public DateTime Date{get;set;}
    public double TotalHours{get;set;}
}


public class TablePricePerHours
{
    public int Id{get;set;}
    public double Price{get;set;}
    public double Tax{get;set;}
    public DateTime Date{get;set;}
}

Теперь вы можете получить требуемый результат с Linq как

var result = tableTotalHours.Select(x=> new 
                                    {
                                        Date=x.Date,
                                        TotalHours=x.TotalHours,
                                        CalculatedPrice = tablePricePerHours.Where(c=> (x.Date - c.Date).Ticks>0)
                                                                            .OrderBy(c=> (x.Date - c.Date).Ticks)
                                                                            .First()
                                                                            .Price * x.TotalHours
                                    });

Выход

enter image description here

Здесь можно найти тот же

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...