sql - Access 2007选择查询结果的第一个值

标签 sql ms-access ms-access-2007

我在 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/

相关文章:

ms-access - Access 中表单的更改有时会成为永久性更改

SQL如何将行映射到列?

mysql - 使用 LIMIT 时 phpMyAdmin Hanngs

mysql - 使用 WHERE 子句过滤 SQL SELECT 语句

mysql - 获取表中不存在的 id 列表

ms-access - 从外部 VBScript 在 Access 2010 中运行 VBA 宏

python - 将 SELECT LAST() 与 pyodbc 和 MSACCESS 一起使用有时会返回相同的值

c# - 使用 OleDb 关闭与 Access DB 的连接

java - "UcanaccessSQLException: unexpected token"当列名包含撇号时

SQL Ms Access 将选择嵌入到某些特定值的 INSERT 语句中