2 つのテーブルBMReports_FPN_CurvesとBMReports_BOA_Curvesがあり、それぞれ名前、日時、期間、値で構成されています。次に例を示します。
BM_UNIT_NAME RunDate Period FPN (or BOA)
T_DRAXX-1 2010-12-01 00:03:00 1 497
RunDate フィールドは 1 分ずつ増加し (これは 1 日あたり約 1440 レコード)、期間は 1 ~ 48 です。BMReports_FPN_Curvesには、各期間の完全なデータ セットがあり、BMReports_BOA_Curvesには、これらの基本値を置き換える値が含まれています。
通常、重複する BOA 値があり、Access SQL ステートメントのネストされた IIF ステートメントには、任意の時点で FPN、最大 BOA 値、または最小 BOA 値のいずれかを選択するルールが含まれていました。ルールには次のように記載されていました。
1) BOA 値がない場合は、FPN 値を使用します。
2) BOA 値があり、FPN より小さい場合は、最小 BOA 値を見つけて使用します。
3) BOA 値があり、それがFPN、最大 BOA 値を見つけて使用する
Access SQL クエリは完全に機能し、次のようになります 。
SELECT
dbo_BMReports_FPN_Curves.BM_Unit_Name,
dbo_BMReports_FPN_Curves.RunDate,
dbo_BMReports_FPN_Curves.Period,
dbo_BMReports_FPN_Curves.PN_Level,
IIf(IIf(Min([dbo_BMReports_BOA_Curves]![PN_Level]) <[dbo_BMReports_FPN_Curves]![PN_Level],Min([dbo_BMReports_BOA_Curves]! [PN_Level]),Max([dbo_BMReports_BOA_Curves]![PN_Level])) Is Null, [dbo_BMReports_FPN_Curves]![PN_Level],
IIf(Min([dbo_BMReports_BOA_Curves]![PN_Level])<[dbo_BMReports_FPN_Curves]! [PN_Level],Min([dbo_BMReports_BOA_Curves]! [PN_Level]),Max([dbo_BMReports_BOA_Curves]![PN_Level]))) AS BOA
FROM dbo_BMReports_FPN_Curves LEFT JOIN dbo_BMReports_BOA_Curves ON (dbo_BMReports_FPN_Curves.RunDate = dbo_BMReports_BOA_Curves.RunDate) AND (dbo_BMReports_FPN_Curves.BM_Unit_Name = dbo_BMReports_BOA_Curves.BM_Unit_Name)
GROUP BY dbo_BMReports_FPN_Curves.BM_Unit_Name, dbo_BMReports_FPN_Curves.RunDate, dbo_BMReports_FPN_Curves.Period, dbo_BMReports_FPN_Curves.PN_Level
HAVING (((dbo_BMReports_FPN_Curves.BM_Unit_Name)='T_DRAXX-1'));
T-SQL (同じ SQL Server データ ソースのクエリ) でクエリの大部分を書き直し、LEFT JOIN、GROUP BY、および HAVING 要素をすべて機能させましたが、IFF の CASE WHEN 置換で行き詰まりました。少し時間があれば、手を差し伸べていただければ幸いです。
現在の SQL クエリ:
SELECT
BMReports_FPN_Curves.BM_Unit_Name,
BMReports_FPN_Curves.RunDate,
BMReports_FPN_Curves.Period,
AVG(BMReports_FPN_Curves.PN_Level) AS FPN,
CASE
WHEN BMReports_BOA_Curves.PN_Level IS NULL THEN AVG(BMReports_FPN_Curves.PN_Level)
WHEN MIN(BMReports_BOA_Curves.PN_Level) IS < AVG(BMReports_FPN_Curves.PN_Level) THEN MIN(BMReports_BOA_Curves.PN_Level)
ELSE MAX(BMReports_BOA_Curves.PN_Level)
END AS BOA
FROM BMReports_FPN_Curves
LEFT JOIN BMReports_BOA_Curves ON BMReports_FPN_Curves.BM_Unit_Name = BMReports_BOA_Curves.BM_Unit_Name
AND BMReports_FPN_Curves.RunDate = BMReports_BOA_Curves.RunDate
GROUP BY BMReports_FPN_Curves.BM_Unit_Name, BMReports_FPN_Curves.RunDate, BMReports_FPN_Curves.Period
HAVING BMReports_FPN_Curves.BM_Unit_Name = 'T_DRAXX-1'
ORDER BY BMReports_FPN_Curves.BM_Unit_Name, BMReports_FPN_Curves.RunDate, BMReports_FPN_Curves.Period