访问子查询

时间:2017-12-31 14:16:51

标签: sql excel ms-access subquery

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

一旦我将Variance列工作,我将删除实际和预测列,但我无法使Variance列正常工作,我怀疑这是因为我需要一个子查询。经过多次尝试,我不知道如何继续。我按照以下快照使用公式=IF(AND(B2=0,C2=0),0,IF(C2=0,IF(B2>0,9.99,-9.99),(B2-C2)/C2))

在Excel中工作
**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结果,并将查看是否可以附加/提供链接。

非常感谢,

西蒙

1 个答案:

答案 0 :(得分:1)

的Excel' S

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