访问子查询

问题描述 投票:1回答:1

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

一旦我有方差列工作,我将删除实际和预测列,但我无法让方差列正常工作,我怀疑这是因为我需要一个子查询。经过多次尝试,我不知道如何继续。我按照以下快照使用公式=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结果,并将查看是否可以附加/提供链接。

非常感谢,

西蒙

sql excel ms-access subquery
1个回答
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用于数字类型,空字符串用于字符串等。

© www.soinside.com 2019 - 2024. All rights reserved.