Sql s_BOA_曲线bc在fc.RunDate=bc.RunDate上 和fc.BM_Unit_Name=bc.BM_Unit_Name 其中fc.BM_Unit_Name='T_DRAXX-1' 分组 fc.BM\u单位名称 ,fc.RunDate ,fc.
s_BOA_曲线bc在fc.RunDate=bc.RunDate上 和fc.BM_Unit_Name=bc.BM_Unit_Name 其中fc.BM_Unit_Name='T_DRAXX-1' 分组 fc.BM\u单位名称 ,fc.RunDate ,fc.期间Sql s_BOA_曲线bc在fc.RunDate=bc.RunDate上 和fc.BM_Unit_Name=bc.BM_Unit_Name 其中fc.BM_Unit_Name='T_DRAXX-1' 分组 fc.BM\u单位名称 ,fc.RunDate ,fc.,sql,tsql,ms-access,case,iif,Sql,Tsql,Ms Access,Case,Iif,s_BOA_曲线bc在fc.RunDate=bc.RunDate上 和fc.BM_Unit_Name=bc.BM_Unit_Name 其中fc.BM_Unit_Name='T_DRAXX-1' 分组 fc.BM\u单位名称 ,fc.RunDate ,fc.期间 谢谢你的帖子-我已经尝试过这种方法,并在分组讨论问题时脱颖而出。我很乐意发布一个示例数据集/访问文件,如果这样做的话。实际上,我认为康拉德(以下)的方法是一个更好的主意;这是我第一次使用CTE,所以我的耳朵后面有点绿,但我会看一看。这非常
谢谢你的帖子-我已经尝试过这种方法,并在分组讨论问题时脱颖而出。我很乐意发布一个示例数据集/访问文件,如果这样做的话。实际上,我认为康拉德(以下)的方法是一个更好的主意;这是我第一次使用CTE,所以我的耳朵后面有点绿,但我会看一看。这非常好用——我想我和我的原版非常接近,你已经把它弄到手了。谢谢你的帮助
BM_UNIT_NAME RunDate Period FPN (or BOA)
T_DRAXX-1 2010-12-01 00:03:00 1 497
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'));
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
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
(
case
when
(
case
when Min(BMReports_BOA_Curves.PN_Level) < BMReports_FPN_Curves.PN_Level then
Min(BMReports_BOA_Curves.PN_Level)
else
Max(BMReports_BOA_Curves.PN_Level)
end
) is null then
BMReports_FPN_Curves.PN_Level
else
(
case
when Min(BMReports_BOA_Curves.PN_Level) < BMReports_FPN_Curves.PN_Level then
Min(BMReports_BOA_Curves.PN_Level)
else
Max(BMReports_BOA_Curves.PN_Level)
end
)
end
) as BOA
WITH cte
AS (SELECT bmreports_fpn_curves.bm_unit_name,
bmreports_fpn_curves.rundate,
bmreports_fpn_curves.period,
AVG(bmreports_fpn_curves.pn_level) AS fpn,
AVG(bmreports_fpn_curves.pn_level) AS boa,
MIN(bmreports_boa_curves.pn_level) minboa,
MAX(bmreports_fpn_curves.pn_level) maxfpn
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')
SELECT bm_unit_name,
rundate,
period ,
CASE
WHEN BOA IS NULL THEN FPN
WHEN BOA < FPN THEN MinBoa
WEHN BOA > FPN THEN MaxBoa
ELSE -- BOA = FPN THEN WHAT?
END as BOA
FROM cte
SELECT bm_unit_name,
rundate,
period ,
CASE
WHEN BOA IS NULL THEN FPN
WHEN BOA < FPN THEN MinBoa
WEHN BOA > FPN THEN MaxBoa
ELSE -- BOA = FPN THEN WHAT?
END as BOA
FROM (
SELECT bmreports_fpn_curves.bm_unit_name,
bmreports_fpn_curves.rundate,
bmreports_fpn_curves.period,
AVG(bmreports_fpn_curves.pn_level) AS fpn,
AVG(bmreports_fpn_curves.pn_level) AS boa,
MIN(bmreports_boa_curves.pn_level) minboa,
MAX(bmreports_fpn_curves.pn_level) maxfpn
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') ) t
SELECT fc.BM_Unit_Name
, fc.RunDate
, fc.Period
, CASE
WHEN AVG(bc.PN_Level) IS NULL THEN AVG(fc.PN_Level) -- No BOA Value, use the FPN Value
WHEN MIN(bc.PN_Level) < AVG(fc.PN_Level) THEN MIN(bc.PN_Level) -- BOA Value is less than the FPN, use the BOA Value
ELSE MAX(bc.PN_Level) -- BOA Value is greater than the FPN, use the BOA Value
END
FROM dbo.BMReports_FPN_Curves fc
LEFT JOIN dbo.BMReports_BOA_Curves bc ON fc.RunDate = bc.RunDate
AND fc.BM_Unit_Name = bc.BM_Unit_Name
WHERE fc.BM_Unit_Name ='T_DRAXX-1'
GROUP BY
fc.BM_Unit_Name
, fc.RunDate
, fc.Period