我有一系列查询生成包含化学数据的报告。有两种化合物A和B,其中A是总量,B是特定的量(例如,总铁和亚铁)。
查询结果中大约有100个化合物,我需要一个条件来过滤结果,以便如果化合物A和B都存在,则只显示化合物B。到目前为止,我已经尝试将一些iif语句添加到查询构建器的criteria部分,但没有成功。
这是我到目前为止所知道的:
SELECT Table1.KEY_ANLT
FROM Table1
WHERE (((Table1.KEY_ANLT)=IIf([Table1].[KEY_ANLT]=1223 And [Table1].[KEY_ANLT]=70,70,1223)));这会过滤掉化合物A,但不包括其余的化合物。如何修改查询以包括其他化合物?
发布于 2017-03-30 09:29:53
因此,为了澄清上面的一些注释,这里的问题是您没有(或没有在上面指定)一种方法来标识组合在一起的值。您给出了70和1223作为示例,但是如果您给我们一个包含所有数字的列表,我们如何能够确定哪些数字组合在一起?你可能会说“化学专业知识”,但这是基于另一个含有化合物名称的专栏,对吧?因此,实际上,您的查询应该使用该列。但是仍然存在如何连接相关名称的问题(例如,“全铁”和“亚铁”可能会连接在一起,因为它们都有“铁”这个词,但是“高锰酸盐”和“锰”呢?)。简而言之,您需要另一个列来指定这些单独行之间的共同之处,无论是元素、离子、电荷等。您还需要一个列来标识您希望在查询中包括每个“组”中的哪一行(或排除哪些行)。例如:
+----------+-----------------+---------+---------+
| KEY_ANLT | Compound | Element | Primary |
+----------+-----------------+---------+---------+
| 70 | total iron | Fe | Y |
| 1223 | ferrous iron | Fe | |
| 1224 | ferric iron | Fe | |
| 900 | total manganese | Mn | Y |
| 901 | permanganate | Mn | |
+----------+-----------------+---------+---------+然后,要获得一个只显示“主要”行的查询,这是非常简单的:
SELECT * FROM Table1 WHERE Primary='Y';如果没有主列,您必须决定如何选择每一行。也许你会想要KEY_ANLT最小的那个?
SELECT Table1.*
FROM
(SELECT Element, min(KEY_ANLT) AS MinKey FROM Table1 GROUP BY Element) AS Subquery
INNER JOIN Table1 ON
Subquery.Element=Table1.Element AND
Subquery.MinKey=Table1.KEY_ANLT查询不起作用的原因是WHERE子句是逐行操作的,并且不会将不同的行相互比较。所以在你的SQL中:
IIf([Table1].[KEY_ANLT]=1223 And [Table1].[KEY_ANLT]=70,70,1223)所有行都不会将其计算为70,因为没有一行具有KEY_ANLT=1223和KEY_ANLT=70。每行只有一个KEY_ANLT值。因此,对于每一行,IIF表达式的计算结果为1223,您的条件将只返回KEY_ANLT=1223 (复合B)的行。
https://stackoverflow.com/questions/42675484
复制相似问题