1

我所追求的是在MS Access中使用sql的基础工作量摘要,这就是我想要做的:

Sum(IIf(([Time Report].Destination) Like 'D-[Time Report].[Baselocation]',0)) AS [Total WorkFromBase in P2]

这不起作用,因为 MS Access 不理解正则表达式,我需要附加的“D-”才能匹配。

据我所知,我的选择是:

  1. 学习并使用 VB 宏(?)来获得正确的模式匹配
  2. 使用一组复杂的 IIf 语句,因为 sql 没有原生else if条件

我不了解VB,我只看过一个例子,我无法理解。

如果我选择大量 IIf,那么我有这样的东西

Sum(
    IIf(D-[Time Report].[Baselocation] = 'Base1', IIf(
        ([Time Report].Destination) = 'D-Base1',
    IIf(D-[Time Report].[Baselocation] = 'Base2', IIf(
        ([Time Report].Destination) = 'D-Base2',
    IIf(D-[Time Report].[Baselocation] = 'Base3a', IIf(
        ([Time Report].Destination) = 'D-Base3a' OR ([Time Report].Destination) = 'D-Base3b',
    IIf(D-[Time Report].[Baselocation] = 'Base3b', IIf(
        ([Time Report].Destination) = 'D-Base3a' OR ([Time Report].Destination) = 'D-Base3b',    ))
)) AS [Total Work From Base in P1],

然后我以一个Syntax Error (Missing operator)类型错误结束,

那么如何匹配两个列,并在它们相似时求和?

4

2 回答 2

1

为什么不在查询中提供可能性表并参考?

 If D-[Time Report].[Baselocation] = 'Base1' IN (SELECT Bases FROM NewTable)

或者

 SELECT D-[Time Report].[Baselocation], NewTable.Destination 
 FROM D-[Time Report] 
 INNER JOIN Newtable
 ON D-[Time Report].[Baselocation] = NewTable.Bases 

其中 NewTable 包含位置列表和该基本映射到的位置。

您还可以使用 LIKE 或 ALIKE 运算符:

IIf(D-[Time Report].[Baselocation] LIKE '*Base1*'

一些参考资料:

基础 Microsoft Jet SQL for Access 2000
中级 Microsoft Jet SQL for Access 2000
高级 Microsoft Jet SQL for Access 2000

于 2012-08-09T12:49:39.597 回答
1

...我需要附加的“D-”才能匹配。

您可以将“D-”连接到[Baselocation],然后使用等于而不是Like比较。

[Time Report].Destination) = "D-" & [Time Report].[Baselocation]

但是一个IIf()表达式包含 3 个参数。

IIf(expr, truepart, falsepart)

在您的示例中,您仅提供了 2 个参数 AFAICT。我认为您希望在 is 时Sum()包含一些值([amount worked]?) ,但在expris时包含TrueexprFalse。也许像这样...

Sum(IIf(([Time Report].Destination) = "D-" & [Time Report].[Baselocation], [amount worked, 0)) AS [Total WorkFromBase in P2]
于 2012-08-09T14:10:36.447 回答