我有一个 SQL 表,它存储向客户收取的不同费率。该表还包括一个“默认”费率列表,如果客户没有特定的费率,则使用这些费率。我需要的是,一旦用户从组合框中选择了一个客户,为该客户创建一个费率表,由默认值或特定于该客户的费率或两者的组合组成,如下所示:
Client Type of Work Rate
ABC Ltd Type A 100
XYZ & Co Type B 150
Default Type A 125
Default Type B 175
因此返回的费率如下所示:
ABC Ltd Type A 100
Type B 175 (default)
XYZ & Co Type A 125 (default)
Type B 150
Anyone else Type A 125 (default)
Type B 175 (default)
数据库中的信息结构如下
Table for clients
Table for Types of Work
Table for Rates (foreign keys linking to clients and types of work)
谁能解释如何最好地使用 SQL 语句、winforms 应用程序中的 C# 例程或两者的组合来获得上述结果。
PS。我很抱歉,但我不确定如何在本网站的表格中设置我的数据。
到目前为止我已经尝试过什么
public static DataTable TableOfRates(string pIPName = "Default")
{
try
{
string sqlText1 = "SELECT RateID, IPName, RateName, Rate, DateFrom, DateTo, Active, " +
"(RateName + ': £' + CONVERT(VARCHAR, Rate) + CONVERT(VARCHAR, " +
"(CASE WHEN Active = '1' THEN ' (Active)' ELSE ' (Inactive)' END))) AS ListRate " +
"FROM tblRates WHERE IPName IS NULL AND Active = 'true';";
aSqlQuery cQ1 = new aSqlQuery(sqlText1, "table");
DataTable defaultRates = cQ1.TableResult;
string sqlText2 = "SELECT RateID, IPName, RateName, Rate, DateFrom, DateTo, Active, " +
"(RateName + ': £' + CONVERT(VARCHAR, Rate) + CONVERT(VARCHAR, " +
"(CASE WHEN Active = '1' THEN ' (Active)' ELSE ' (Inactive)' END))) AS ListRate " +
"FROM tblRates WHERE IPName = '" + pIPName + "' " +
"AND Active = 'true';";
aSqlQuery cQ2 = new aSqlQuery(sqlText2, "table");
DataTable clientRates = cQ2.TableResult;
foreach(DataRow defaultRow in defaultRates.Rows)
{
string defaultType = defaultRow["RateName"].ToString();
foreach (DataRow clientRow in clientRates.Rows)
{
string clientType = clientRow["RateName"].ToString();
if (defaultType == clientType)
{
clientRates.Rows.Add(defaultRow.ItemArray);
}
}
}
return clientRates;
}
catch (Exception eX)
{
throw new Exception("cRate: Error compiling Table Of Rates (mode = '" + pIPName + "')" + Environment.NewLine + eX.Message);
}
}
但是,无论我使用 Add Row、Import Row 还是 Add Item Array,都会出现错误。它似乎不喜欢使用来自多个表的数据行。