Sql 访问子查询

Sql 访问子查询,sql,excel,ms-access,subquery,Sql,Excel,Ms Access,Subquery,几天来,我一直在与一个查询问题作斗争,并浏览答案,我认为我可能无法应用找到的逻辑,因为我不擅长SQL。我有两个表,[0100]和[Product],需要计算每个类别的实际值和预测值之间的差异。我尝试了许多子查询,但无法使它们正常工作,因此我回到这里: SELECT Product.Description, Sum([0100].Actual) AS Actual, Sum([0100].Forecast) AS Forecast, Sum(IIf([0100]![

几天来,我一直在与一个查询问题作斗争,并浏览答案,我认为我可能无法应用找到的逻辑,因为我不擅长SQL。我有两个表,[0100]和[Product],需要计算每个类别的实际值和预测值之间的差异。我尝试了许多子查询,但无法使它们正常工作,因此我回到这里:

SELECT
    Product.Description,
    Sum([0100].Actual) AS Actual,
    Sum([0100].Forecast) AS Forecast,
    Sum(IIf([0100]![Forecast]=0,
            IIf([0100]![Actual]=0,
                0,
                IIf([0100]![Actual]>0,9.99,-9.99)
            ),
            ([0100]![Actual]-[0100]![Forecast])/[0100]![Forecast]
        )
    ) AS Variance
FROM
    0100
    INNER JOIN Product ON [0100].Category = Product.ID
GROUP BY
    Product.Description;
一旦“差异”列正常工作,我将删除“实际”列和“预测”列,但我无法使“差异”列正常工作,我怀疑这是因为我需要一个子查询。经过多次尝试,我不知道如何继续。我让它在Excel中按照以下公式运行:
=IF(AND(B2=0,C2=0),0,IF(C2=0,IF(B2>0,9.99,-9.99),(B2-C2)/C2))

是否有人能提供帮助,使差异查询正确,从而返回与Excel公式相同的结果?我有一个样本数据库,其中只有产品表和
0100
表,其中记录返回提供的Excel结果,我将查看是否可以附加/提供链接

非常感谢,

西蒙

Excel的

=IF(AND(B2=0,C2=0),0,IF(C2=0,IF(B2>0,9.99,-9.99),(B2-C2)/C2))
在访问方面的等效值为:

IIf([0100]![Actual] = 0 And [0100]![Forecast] = 0,
    0,
    IIf([0100]![Forecast] = 0,
        IIf([0100]![Actual] > 0, 9.99, -9.99),
        ([0100]![Actual]-[0100]![Forecast]) / [0100]![Forecast]
    )
)
如果值可以是
Null
(即,如果字段为空),则测试
Nz(x)=0
,而不仅仅是
x=0

IIf(Nz([0100]![Actual]) = 0 And Nz([0100]![Forecast]) = 0,
    0,
    IIf(Nz([0100]![Forecast]) = 0,
        IIf(Nz([0100]![Actual]) > 0, 9.99, -9.99),
        (Nz([0100]![Actual])-Nz([0100]![Forecast])) / Nz([0100]![Forecast])
    )
)

函数
IIf(condition,IfExpression,ElseExpression)
返回
IfExpression
ElseExpression
,但它总是对这两个表达式求值。因此,即使在测试值为0的情况下,也有必要应用
Nz()
函数
Nz()
Null
转换为
Empty
,并且
Empty
是类型的默认值。数值类型为
0
,字符串为空字符串等。

请显示问题中的实际和预期结果以及示例表。问题(不带附件)应包括提供答案所需的所有信息。始终发布错误消息或收到的不希望出现的结果,因为它们无法正常工作,这是没有帮助的。
IIf(Nz([0100]![Actual]) = 0 And Nz([0100]![Forecast]) = 0,
    0,
    IIf(Nz([0100]![Forecast]) = 0,
        IIf(Nz([0100]![Actual]) > 0, 9.99, -9.99),
        (Nz([0100]![Actual])-Nz([0100]![Forecast])) / Nz([0100]![Forecast])
    )
)