访问查询设计 - 复杂条件?
Access Query Design - Complex Criteria?
我正在尝试找出创建查询的最佳方法。
假设我有两个 tables
在查询中,我希望 [Carrier] 值为 'IRT'。当 [Co State] = [Lic State] 时,我希望显示 [Line],但在 SC 和 TN 有两个不同的行条目的情况下,我只需要显示 'M' 值。
示例结果如下:
table数据只是一个假样本。真实数据包括所有 50 个州,一些 [Lic State] 有一个值,少数有两个。
是否有一种简单的方法可以通过一个查询创建这些结果,或者最好创建一个省略 'SC' 和 'TN' 的 [Lic State] 的查询,以及一个仅包括 'SC' 和 'TN' 具有 'M' 的 [Line],然后获取两个查询的 SQL 并通过 UNION?
加入它们
我在手机上,只是为了好玩,是的......它不干净,但想法就在那里。
您需要使用分组方式,因为每个州只需要一条记录。
Select first (carrier), first (Costate), iif(count (line)>1,"M", first (line))
from (select costate from t2 where licstate="irt") left join t1 on Costate=licstate
按海岸分组
您需要使用聚合函数。您可以通过 IIF 聚合。因此,如果您按 CoState 分组并为每个带有 M 的记录计数 1,则可以在聚合值上使用 IIF 并在需要时返回 M,否则返回第一个值(因为就您的问题而言,只有一个值):
SELECT Tabelle2.Carrier, Tabelle2.CoState, IIf(Max(IIf([Tabelle1].[Line]="M",1,0))=1,"M",First([Tabelle1].[Line])) AS Line
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.LicState = Tabelle2.CoState
GROUP BY Tabelle2.Carrier, Tabelle2.CoState
HAVING (((Tabelle2.Carrier)="IRT"));
所以它的三个步骤:内部 IIF 为每个带有 M 的记录集返回 1。聚合将其转换为 1,对于应该返回 M 的记录,对于其他记录为 0 - 最后是外部IIF 处理聚合函数并返回 M 或线值。由于您正在分组,因此您还需要聚合该值 - 您可以使用 FIRST 指令执行此操作。
我正在尝试找出创建查询的最佳方法。
假设我有两个 tables
在查询中,我希望 [Carrier] 值为 'IRT'。当 [Co State] = [Lic State] 时,我希望显示 [Line],但在 SC 和 TN 有两个不同的行条目的情况下,我只需要显示 'M' 值。
示例结果如下:
table数据只是一个假样本。真实数据包括所有 50 个州,一些 [Lic State] 有一个值,少数有两个。
是否有一种简单的方法可以通过一个查询创建这些结果,或者最好创建一个省略 'SC' 和 'TN' 的 [Lic State] 的查询,以及一个仅包括 'SC' 和 'TN' 具有 'M' 的 [Line],然后获取两个查询的 SQL 并通过 UNION?
加入它们我在手机上,只是为了好玩,是的......它不干净,但想法就在那里。
您需要使用分组方式,因为每个州只需要一条记录。
Select first (carrier), first (Costate), iif(count (line)>1,"M", first (line)) from (select costate from t2 where licstate="irt") left join t1 on Costate=licstate 按海岸分组
您需要使用聚合函数。您可以通过 IIF 聚合。因此,如果您按 CoState 分组并为每个带有 M 的记录计数 1,则可以在聚合值上使用 IIF 并在需要时返回 M,否则返回第一个值(因为就您的问题而言,只有一个值):
SELECT Tabelle2.Carrier, Tabelle2.CoState, IIf(Max(IIf([Tabelle1].[Line]="M",1,0))=1,"M",First([Tabelle1].[Line])) AS Line
FROM Tabelle1 INNER JOIN Tabelle2 ON Tabelle1.LicState = Tabelle2.CoState
GROUP BY Tabelle2.Carrier, Tabelle2.CoState
HAVING (((Tabelle2.Carrier)="IRT"));
所以它的三个步骤:内部 IIF 为每个带有 M 的记录集返回 1。聚合将其转换为 1,对于应该返回 M 的记录,对于其他记录为 0 - 最后是外部IIF 处理聚合函数并返回 M 或线值。由于您正在分组,因此您还需要聚合该值 - 您可以使用 FIRST 指令执行此操作。