0

クライアントに請求されるさまざまなレートを格納する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。申し訳ありませんが、このWebサイトの表にデータを設定する方法がわかりません。

私がこれまでに試したこと

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);
        }
    }

ただし、[行の追加]、[行のインポート]、または[アイテム配列の追加]のいずれを使用しても、エラーが発生します。複数のテーブルのデータ行を使用するのは好きではないようです。

4

2 に答える 2

0

本当にDataTableをロードする必要がある場合:

CREATE TABLE 
     #MyTempTable (myColumn1 DataType, myColumn2 DataType, myColumn3 DataType) 
INSERT INTO 
     #MyTempTable(myColumn1, myColumn2, myColumn3)
SELECT 
     f.Bar1, o.Bar2, o.Bar3 FROM FooTable AS f 
INNER JOIN 
     TableFoo o ON f.Bar1 = o.Bar1

このスクリプトを微調整すると、接続が維持されている限り存続し、必要な他のテーブルのデータが含まれている一時テーブルが作成されます。

于 2012-11-19T16:43:36.840 に答える
0

クライアントとジョブを一覧表示するテーブルが必要です。これを念頭に置いて、次のようなことを行っている可能性があります。

SELECT
  CASE R1.RATE WHEN NULL THEN R2.RATE else r1.rate AS RATE END
FROM
  CLIENTJOBS C LEFT JOIN RATES R1 ON
    R1.CLIENT = C.CLIENT AND R1.WORKTYPE = C.WORKTYPE
  JOIN RATES R2 ON
    R2.WORKTYPE = C.WORKTYPE AND R2.CLIENT = 'DEFAULT'

これはテストされていない推測コードであることを覚えておいてください。

于 2012-11-19T16:10:50.070 に答える