sql - 工作 Access SQL 查询的 T-SQL 迁移,在编写 IIF 的 CASE 替换时存在问题

标签 sql t-sql ms-access case iif

我有两个表BMReports_FPN_CurvesBMReports_BOA_Curves,每个表都包含名称、日期时间、周期和值,例如:

BM_UNIT_NAME   RunDate               Period  FPN (or BOA)
T_DRAXX-1      2010-12-01 00:03:00   1       497

RunDate 字段以一分钟递增(每天约 1440 条记录),Period 为 1-48。在 BMReports_FPN_Curves 中,我有每个时间段的完整数据集,并且 BMReports_BOA_Curves 包含将替换这些基值的值。

Access SQL 语句中通常存在重复的 BOA 值和嵌套 IIF 语句,其中包含一条规则,用于选择任意时间点的 FPN、最大 BOA 值或最小 BOA 值之一。该规则规定:

1) 如果没有BOA值,则使用FPN值
2) 如果存在BOA值且小于FPN,则查找并使用Min BOA值
3)如果存在BOA值并且大于FPN,则查找并使用Max 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 元素全部正常工作,但我陷入了 CASE WHEN 替换的困境对于 IFF,如果有人有空闲时间,我将非常感激。

当前的 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

最佳答案

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

关于sql - 工作 Access SQL 查询的 T-SQL 迁移,在编写 IIF 的 CASE 替换时存在问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4972952/

相关文章:

用于随机分配调查的 SQL Server 存储过程

t-sql - TSQL 解析带有 4 个分隔符的字符串

c# - access sql 创建前检查索引是否存在

excel - 返回当月第一个日期和最后一个日期的函数

php - 获取用户的所有帖子及其类别

sql - 使用 OPENXML 从 XML 文件读取时获取 NULL 值

java - 我需要连接我的 java 应用程序来访问 Windows 7 x64 中的数据库?

sql - 如何在 SQL Server 中 nvarchar(max) 类型列中现有的 json 结构中添加新属性

ms-access - 整数类型的最大值是否有常量?

mysql - 无法让 sql 表连接工作