2016-02-29 63 views
2

我碰到的尝试写一些SQL的MS Access将分析一些数据在我希望的方式向下一个问题。虽然我承认新的(或仍然在学习超出了大专班我花了五年前的边界)与问候到SQL,我想,认为我想要做的可以完成。访问SQL条件分句多个条件/记录栏一样

场景: 虽然我可能没有开始这个所有有效下手的,我开始和两个表。原始数据集从72K记录开始。

这个目标,或者我在这个案子中想要达到的目标是找到某个人出现多于一个指控的所有记录,然而定义为拥有0分的指控的结果是有罪的,但是其他费用被发现NG或解雇。

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

的外观的一个例子是类似以下内容:

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 

然后我创建了各自三个小的查询要求出示数据从一个子集主查询,一个用于观察= GT,点= 0,另一个用于结果= NG,积分> 2,最后结果= 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 

当单个记录被拔​​掉,并且其中结果是DI/0,所有的APP涉及的费用。

我一直在使用一个简单的WHERE子句仅分析记录单值试图目前尝试。我想我正在寻找一种方法来评估两者。也许,如果我写的价值单独的临时表,然后做了工会只对出现的两个表中的APP值会更容易?

任何帮助或指导将不胜感激!

回答

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的要求

首先下载应用:上述

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

重用以获得具有比0和更大的点值的APP DI或NG:

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') 

接着,结合上述逻辑成一个查询,使用两个subquer IES,为了只拉满足这两个要求的应用数据:

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电荷,而另一个电荷是DI或NG用1组或更大的PT应用程序。

+0

对不起,我清理了我的问题,以便更清楚一点。我想要做的是清除所有记录中包含仅为0的点值的实例。因此,如果某人有5条记录,我需要能够将它们与自己进行比较。 – dramerus

+0

到目前为止我唯一的想法就是解决这个问题,如下所示:分开收费/应用程序组合,这些收费/应用程序组合不包含点数。生成一个适用APP的列表,然后在两个表格之间进行比较。如果两者都不出现,那么它将不被包括在内....也许?想法? – dramerus

+0

我仍然有点困惑 - 用你的逻辑测试我的建议会给你提供你请求的结果集。 http://sqlfiddle.com/#!9/97c0c/3 –