【问题标题】:Access Subquery访问子查询
【发布时间】:2018-06-11 02:38:12
【问题描述】:

几天来,我一直在努力解决一个查询问题,并浏览了答案,并认为我可能无法应用找到的逻辑,因为我不擅长 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))

**Column A                             B           C          Formula
Account Group                     Actual      Forecast     Variance**
Admin & Management staff costs    -8256.61    -8256.61           0%
Bank interest                       0                0           0%
Care staff 4 weekly paid             268           268           0%
Care staff travel   -70 -70 0%
Contracts - health & soc services -748317.97   -788317.97       -5%
Donations & fundraising             -9665.69     -9465.69        2%
Fundraising & promotion              4695.68      4695.68        0%
Grants                                -28687       -39687      -28%

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

非常感谢,

西蒙

【问题讨论】:

  • 请在问题中显示实际和预期的结果和示例表。问题(不带附件)应包含提供答案所需的所有信息。
  • 总是发布错误消息或您收到的不想要的结果,但无法让它们工作没有帮助。

标签: sql excel ms-access subquery


【解决方案1】:

Excel 的

=IF(AND(B2=0,C2=0),0,IF(C2=0,IF(B2>0,9.99,-9.99),(B2-C2)/C2))

Access 中的等效项是:

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) 返回IfExpressionElseExpression,但它总是计算这两个表达式。因此,即使在值被测试为 0 的情况下,也有必要应用 Nz() 函数。Nz()Null 转换为 Empty 并且 Empty 是类型的默认值。数字类型为0,字符串等为空字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-30
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-15
    相关资源
    最近更新 更多