访问 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 费用的应用程序。
我 运行 在尝试为 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 费用的应用程序。