访问 SQL 条件子句多个 Conditions/Records 同一列

Access SQL Conditional Clause Multiple Conditions/Records Same Column

我 运行 在尝试为 MS Access 编写一些 SQL 时遇到了问题,它将按照我希望的方式解析一些数据。诚然,在 SQL 方面,我是新人(或者仍在学习超出大学 class 范围的知识),但我想我正在尝试做的事情可以得以实现。

场景: 虽然我一开始可能没有那么高效,但我从两个 table 开始。原始数据集开始时只有不到 72k 条记录。

我的目标,或者说我在这个案例中想要完成的是找到所有记录,其中有人因多次指控而出庭,而被定义为 0 分的指控的结果是有罪的,然而,其他指控被发现为 NG 或 Dismissed。

这是我目前所拥有的。我开始使用的数据来自两个 table,一个包含外观,一个包含代码和点数。

外观示例类似于以下内容:

APP    DATE      CHARGE    OUTCOME  
===================================
1      1/1/2014   137      GT        
2      1/5/2014   122      GT        
2      1/5/2014   123      DI       
3      1/6/2014   257      DI
3      1/6/2014   257      DI
4      1/6/2014   137      NG
4      1/6/2014   123      DI
4      1/6/2014   122      GT

我有第二个 table 将费用链接到与费用相关的潜在点数,那里的格式相当简单

CHARGE    POINT
===============
122       0
123       2
137       2
257       0

所以我创建了一些基本查询,因为我主要是根据提供给我的大量数据文件来填补空白。第一个拉动将前两个 table 连接在一起,所以我剩下一个 table,看起来类似于:

APP    DATE      CHARGE    OUTCOME  POINTS
==========================================
1      1/1/2014   137      GT       2      
2      1/5/2014   122      GT       0
2      1/5/2014   123      DI       2
3      1/6/2014   257      DI       0
3      1/6/2014   257      DI       0
4      1/6/2014   137      NG       2
4      1/6/2014   123      DI       2
4      1/6/2014   122      GT       0

然后我创建了三个小查询,每个查询都被要求从主查询中生成一个数据子集,一个用于 OUTCOME=GT,Points=0,另一个用于 Outcome=NG,Points>2,最后一个 Outcome= DI,点> 2。每个查询都在 make table 查询中调用,使记录集从原来的 72k 减少到 39k。使用

应用另一个查询
Select * from record_set Where RecordID IN
(Select RecordID from record_Set
GROUP BY RecordID
HAVING COUNT (*) > 1))

最后将总数降至略低于 21k。

我的问题是: 我想要的数据集return需要进一步过滤结果。目前我还没有弄清楚如何清除两个值都为 0 的 APP 值。据我所知,我应该用一种完全不同的方式来处理这个问题。

编辑: 我要寻找的是 return 看起来像这样的数据集:

APP    DATE      CHARGE    OUTCOME  POINTS
==========================================      
2      1/5/2014   122      GT       0
2      1/5/2014   123      DI       2
4      1/6/2014   137      NG       2
4      1/6/2014   123      DI       2
4      1/6/2014   122      GT       0

提取单个记录的位置,以及所有涉及的费用的结果 DI/0 的应用程序。

我目前尝试使用直接的 WHERE 子句仅评估记录的单个值。我想我正在寻找一种方法来评估两者。如果我将值写入分隔 temp tables,然后只对出现在两个 tables 中的 APP 值进行联合,也许会更容易?

如有任何帮助或指导,我们将不胜感激!

我的 MS-Access 经验几乎为零,但我相信这种语法会起作用。至少它可能会激发一些想法。

SELECT APP, DATE, CHARGE, OUTCOME, POINTS
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE (Outcome = 'GT' and Points = '0')
OR (Outcome = 'NG' and Points > '2')
OR (Outcome = 'DI' and Points > '2')

我不确定两个值都为 0 的情况是什么意思,但您很可能可以添加另一个 WHERE 子句来过滤掉它们。

编辑:

I guess the data set I am seeking will always have the following: More than one APP, while containing one record with 0 PTS that was a GT, and one (or more records) that can be a point value greater than 0 that is either DI or NG. The reason I started at 2 is that I know there aren't any values that contain a 1, but I guess to be thorough they could be included

首先获取满足0 PT和GT要求的APP:

SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE Outcome = 'GT'
AND Points = '0'

重用以上获取点值大于0且DI或NG的APP:

SELECT APP
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE (Outcome = 'DI' AND Points > '0')
OR (Outcome = 'NG' AND Points > '0')

接下来将上述逻辑合并为一个查询,使用两个子查询,为了只拉取同时满足两个要求的APP数据:

SELECT APP, DATE, A.CHARGE, OUTCOME, POINTS
FROM APP A
INNER JOIN CHARGE C on C.Charge = A.Charge
WHERE APP IN (
   SELECT APP
   FROM APP A
   INNER JOIN CHARGE C on C.Charge = A.Charge
   WHERE Outcome = 'GT'
   AND Points = '0'
)
AND APP IN (
   SELECT APP
   FROM APP A
   INNER JOIN CHARGE C on C.Charge = A.Charge
   WHERE (Outcome = 'NG' AND Points > '0')
   OR (Outcome = 'DI' AND Points > '0')
)

这将导致只有具有 GT、0 PT 费用以及具有 1 或更多 PT 的 DI 或 NG 费用的应用程序。