查询以获得正确的匹配

时间:2014-05-02 14:20:23

标签: ms-access ms-access-2010

我有一个包含4位成本中心和费率的表格,我需要将其与具有4位数成本中心的表格相匹配。问题是带有费率的表以不同的方式列出成本中心。它使用" X"意思是"包括所有这些。"因此,如果它希望每个以1开头的成本中心具有一定的速率,则表明1XXX具有一定的速率。我的成本中心表有实际的4位数字,如1000.

如果费率表中的每个成本中心都是1位数,我可以处理这个,但有些成本中心有3位数和X(100X),有些只有一位数和X(1XXX)。如何处理所有可能的变化并确保我在最低级别匹配?

Rate table:
1xxx = $10
12xx = $5
123x = $2
2xxx = $15
3456 = $5
3xxx = $10

如何确保成本中心1234能够获得2美元而成本中心1000能够获得10美元?

1 个答案:

答案 0 :(得分:1)

我可以通过3个简单的查询来完成 - 也许其他人可以向我们展示如何将它们组合成一个。

首先 - 查找中心之间的所有匹配(要查找的中心列表)和cost_centers(费率表) - 我将此查询称为“所有匹配”

SELECT Centers.Center, Rates.cost_center, Rates.rate, Max(InStr([cost_center] & "x","x")-1) AS n
FROM Centers, Rates
GROUP BY Centers.Center, Rates.cost_center, Rates.rate, Left([center],InStr([cost_center] & "x","x")-1)=Left([cost_center],InStr([cost_center] & "x","x")-1)
HAVING (((Left([center],InStr([cost_center] & "x","x")-1)=Left([cost_center],InStr([cost_center] & "x","x")-1))=True));

其次,找到最低级别匹配,或先前查询中具有最高“n”的匹配 - 我称之为“选定匹配”

SELECT [All matches].Center, Max([All matches].n) AS n
FROM [All matches]
GROUP BY [All matches].Center;

最后,获得相应的费率:

SELECT [All matches].Center, [All matches].cost_center, [All matches].rate
FROM [All matches] INNER JOIN [selected matches] ON ([All matches].n = [selected matches].n) AND ([All matches].Center = [selected matches].Center);