我在Access 2013中有以下2个表格
**tbl_GroupInvoices**
CustomerName | CountryCode | Group | UsageRate | SelectedTier |
------------ | ----------- | ----- | --------- | ------------ |
CUST1 | FR | GROUP1 | | 0 |
CUST1 | FR | GROUP2 | 8.40% | 0 |
CUST1 | FR | GROUP3 | 47.91% | 0 |
CUST1 | FR | GROUP4 | 89.53% | 0 |
CUST1 | FR | GROUP5 | 45.34% | 0 |
tbl_GenericTiers
CustomerName | CountryCode | TierName | UsageRate
------------ | ----------- | -------- | --------- |
CUST1 | FR | GROUP1 | 20 |
CUST1 | FR | GROUP1 | 40 |
CUST1 | FR | GROUP1 | 60 |
CUST1 | FR | GROUP1 | 80 |
CUST1 | FR | GROUP2 | 20 |
CUST1 | FR | GROUP2 | 40 |
CUST1 | FR | GROUP2 | 60 |
CUST1 | FR | GROUP2 | 80 |
我需要从tbl_GenericTiers确定表tbl_GroupInvoices上的选定层, 知道通过查看tbl_GroupInvoices中组的实际使用率并选择层来选择层 包含使用率。
e.g。 如果使用率= 45.6% 我为该组定义了2层:
我需要选择40%的等级
如果使用率为64.3%,那么我选择60%等级。
我的SQL查询如下所示:
UPDATE tbl_GroupInvoices
SET tbl_GroupInvoices.SelectedTier = TmpTable.MaxUsageRate
FROM (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >= tbl_GenericTiers.UsageRate) AS TmpTable
我不断收到以下错误消息:
Syntax error (missing operator) in query expression 'TmpTable.MaxUsageRate
FROM (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >= tbl_GenericTiers.UsageRate) AS TmpTable'
答案 0 :(得分:0)
试试这个:
UPDATE tbl_GroupInvoices
SET tbl_GroupInvoices.SelectedTier = (
SELECT MAX(tbl_GenericTiers.UsageRate) AS MaxUsageRate
FROM tbl_GroupInvoices, tbl_GenericTiers
WHERE tbl_GroupInvoices.CustomerName = tbl_GenericTiers.CustomerName
AND tbl_GroupInvoices.CountryCode = tbl_GenericTiers.CountryCode
AND tbl_GroupInvoices.[Group] = tbl_GenericTiers.TierName
AND tbl_GroupInvoices.UsageRate >=UsageRate);
有什么不同之处在于我没有将嵌套的SELECT语句放在FROM中。相反,我把它放在等于的另一边。我认为这是正确的,因为我在这里找到了嵌套SELECT语句的在线示例:https://msdn.microsoft.com/en-us/library/office/aa217680(v=office.11).aspx。这是具体的例子:
SELECT Orders.CustomerID, Orders.OrderDate,
(SELECT MAX(OrderDate)
FROM Orders AS Orders1
WHERE Orders1.OrderDate < Orders.OrderDate
AND Orders1.CustomerID = Orders.CustomerID)
AS PreviousOrderDate,
[OrderDate]-[PreviousOrderDate] AS OrderInterval
FROM Orders
ORDER BY Orders.CustomerID, Orders.OrderDate DESC;
遵循这个结构,我能够将您的查询保存在我的访问数据库中,这意味着没有语法错误,所以它应该工作。它只是现在结果的问题以及您希望查询返回的内容。
答案 1 :(得分:0)
我很确定你不能在UPDATE查询中使用聚合函数,而是尝试使用域聚合(未经过完全测试):
UPDATE tbl_GroupInvoices GI INNER JOIN tbl_GenericTiers GT ON GI.CustomerName = GT.CustomerName AND
GI.CountryCode = GT.CountryCode AND
GI.[Group] = GT.TierName AND
GI.UsageRate = GT.UsageRate
SET GI.SelectedTier = DMAX("UsageRate", "tbl_GenericTiers", "CustomerName = '" & GI.CustomerName & "' AND
CountryCode = '" & GI.CountryCode & "' AND
TierName = '" & GI.[Group] & "'")
编辑:在Access中设置值之前首先列出表连接 - 基本上是没有SELECT字段或FROM语句的查询(写一个普通的选择查询,删除FROM之前的所有内容并将FROM更改为UPDATE)。