【问题标题】:Access Query Design - Complex Criteria?访问查询设计 - 复杂标准?
【发布时间】:2016-11-16 22:14:06
【问题描述】:

我正在尝试找出创建查询的最佳方法。

假设我有两张桌子

在查询中,我希望 [Carrier] 值为“IRT”。当 [Co State] = [Lic State] 时,我希望显示 [Line],但在 SC 和 TN 有两个不同的行条目的情况下,我只需要显示“M”值。

示例结果如下所示:

表格数据只是一个假样本。真实数据包括所有 50 个州,一些 [Lic State] 将具有一个值,而少数将具有两个值。

是否有一种简单的方法可以通过一个查询创建这些结果,或者最好创建一个省略“SC”和“TN”的 [Lic State] 的查询,以及仅包含“SC”和'TN' 的 [Line] 为 'M',然后获取两个查询的 SQL 并通过 UNION 连接它们?

【问题讨论】:

  • 当两个值存在时,只有 SC 和 TN 有特殊要求吗?最好发布数据而不是图片。

标签: ms-access union criteria


【解决方案1】:

我在移动设备上,只是为了好玩,是的....它不干净,但想法就在那里。

您需要使用分组依据,因为您只希望每个州有一条记录。

选择第一个(运营商),第一个(Costate),iif(count(行)>1,“M”,第一个(行)) from (select costate from t2 where licstate="irt") left join t1 on Costate=licstate 按成本分组

【讨论】:

    【解决方案2】:

    您需要使用聚合函数。您可以聚合 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 或 Line-Value。由于您正在分组,因此您还需要聚合该值 - 您可以使用 FIRST 指令。

    【讨论】:

    • 两个答案(Johanness 和 user6788933 的)都适用于我想做的事情。感谢您的帮助!
    • 对于给定的数据,他们确实做同样的事情。 user6788933s 解决方案使用子查询 (SELECT FROM (SELECT...)),如果您有其他可能性,我认为您应该避免使用它,因为它可能非常缓慢且消耗内存。如果您使用 count(line) ,则只有在带有 M 列的 costates 上总是有第二列时才有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多