访问SQL条件子句多个条件/记录同一列

时间:2016-02-29 19:40:55

标签: sql ms-access ms-access-2013

我遇到了一个问题,试图为MS Access编写一些SQL,它将以我希望的方式解析一些数据。虽然我在SQL方面确实是新的(或者仍然在学习五年前的大学课程范围之外学习),但我想我可以想到我想要做的事情。 。

场景: 虽然我可能没有开始这么高效的开始,但我从两个表开始。原始数据集以少于72k的记录开始。

目标,或者我在这个案子中想要完成的是找到有人出现多个指控的所有记录,并且定义为有0分的指控的结果是有罪的,但是其他费用是NG或Dismissed。

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

外观的示例与以下内容类似:

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

我有一张第二张表,它将电量与充电相关的潜在点数相关联,相当简单的格式化

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

所以我创建了一些基本查询,因为我基于提供给我的批量数据文件主要填充空白。拉出的第一个将前两张桌子连在一起,所以我留下了一张桌子,看起来像是这样的:

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。每个查询都在生成表查询中调用,该查询将记录集从原始的72k降低到39k。使用

应用另一个查询
Select * from record_set Where RecordID IN
(Select RecordID from record_Set
GROUP BY RecordID
HAVING COUNT (*) > 1))
最后总结降到了不到21k。

我的问题是: 我想要返回的数据集需要进一步过滤结果。目前我还没弄清楚如何在两个值为0的情况下清除APP值。我知道我应该以完全不同的方式接近这个。

编辑: 我要找的是返回的数据集,如下所示:

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

拉出单个记录的地方,以及所有费用的OUTCOME为DI / 0的APP。

我尝试使用直接WHERE子句的当前尝试仅评估记录单值。我想我正在寻找一种评估两者的方法。如果我将值写入单独的临时表,然后仅为两个表中出现的APP值进行联合,那么这可能会更容易一些吗?

非常感谢任何帮助或指导!

1 个答案:

答案 0 :(得分:0)

我的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子句来过滤它们。

编辑:

  

我想我正在寻找的数据集将始终具有以下内容:更多   比一个APP,同时包含一个0 PTS是GT的记录,   和一个(或多个记录)可以是大于0的点值   这是DI或NG。我从2开始的原因是我知道   没有任何值包含1,但我想要彻底   他们可以包括在内

首先获得满足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')
)

这将导致只有APP具有GT,0 PT充电,以及另一个带有1个或更多PT的DI或NG充电。