我在 Access (2007) 中遇到了一个相当烦人的事情,我不确定这是否是一个功能,或者我是否在要求不可能的事情。
虽然实际的数据库结构更复杂,但我的问题归结为:
我有一个表格,其中包含有关特定年份的单位数据。这些数据来自不同的来源,并且可能重叠。
Unit | IYR | X1 | Source |
-----------------------------
A | 2009 | 55 | 1 |
A | 2010 | 80 | 1 |
A | 2010 | 101 | 2 |
A | 2010 | 150 | 3 |
A | 2011 | 90 | 1 |
...
现在我希望用户选择某些来源,按优先级排序,然后每年提取一个数据值。 例如,如果用户选择源 1、2 和 3 并按 (3, 1, 2) 对它们进行排序,那么我想要以下结果:
Unit | IYR | X1 | Source |
-----------------------------
A | 2009 | 55 | 1 |
A | 2010 | 150 | 3 |
A | 2011 | 90 | 1 |
我可以根据特定顺序订购初始表。我使用以下查询来执行此操作
SELECT Unit, IYR, X1, Source
FROM TestTable
WHERE Source In (1,2,3)
ORDER BY Unit, IYR,
IIf(Source=3,1,IIf(Source=1,2,IIf(Source=2,3,4)))
这给了我以下中间结果:
Unit | IYR | X1 | Source |
-----------------------------
A | 2009 | 55 | 1 |
A | 2010 | 150 | 3 |
A | 2010 | 80 | 1 |
A | 2010 | 101 | 2 |
A | 2011 | 90 | 1 |
下一步是仅获取每年的第一个值。我正在考虑使用以下查询:
SELECT X.Unit, X.IYR, first(X.X1) as FirstX1
FROM (...) AS X
GROUP BY X.Unit, X.IYR
其中 (...) 是上面的查询。
现在 Access 变得很糟糕。无论我对中间结果给出什么顺序,该查询的结果都是。
Unit | IYR | X1 |
--------------------
A | 2009 | 55 |
A | 2010 | 80 |
A | 2011 | 90 |
换句话说,对于 2010 年,它显示源 1 的值而不是 3。似乎 Access 在应用 FIRST() 函数时并不关心嵌套查询的顺序,并坚持使用 FIRST() 的原始顺序数据。
这是 Access 的一项功能还是有其他方法可以实现所需的结果?
Ps:下一步是使用自连接将源列再次添加到结果中,但我首先需要解决上述问题。
最佳答案
与其先使用,不如先确定 MIN 优先级,然后再加入,例如
SELECT
t.UNIT,
t.IYR,
t.X1,
t.Source ,
t.PrioritySource
FROM
(SELECT
Unit,
IYR,
X1,
Source,
SWITCH ( [Source]=3, 1,
[Source]=1, 2,
[Source]=2, 3) as PrioritySource
FROM
TestTable
WHERE
Source In (1,2,3)
) as t
INNER JOIN
(SELECT
Unit,
IYR,
MIN(SWITCH ( [Source]=3, 1,
[Source]=1, 2,
[Source]=2, 3)) as PrioritySource
FROM
TestTable
WHERE
Source In (1,2,3)
GROUP BY
Unit,
IYR ) as MinPriortiy
ON t.Unit = MinPriortiy.Unit and
t.IYR = MinPriortiy.IYR and
t.PrioritySource = MinPriortiy.PrioritySource
这将产生此结果(注意我包括源和优先源仅用于演示目的)
UNIT | IYR | X1 | Source | PrioritySource
----------------------------------------------
A | 2009 | 55 | 1 | 2
A | 2010 | 150 | 3 | 1
A | 2011 | 90 | 1 | 2
请注意,第一个子查询是为了处理 Access 不允许您在 Switch 上加入的事实
关于sql - Access 2007选择查询结果的第一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9722172/