Office中国论坛/Access中国论坛

标题: 按条件提取不重复值 [打印本页]

作者: kent_73    时间: 2012-9-17 13:29
标题: 按条件提取不重复值
如何根据特定的字段筛选出不重复记录?
条件是:如果字段【收到类别】中的值是1,则使用1所对应的数据;如果没有1,则用2所对应的数据。
还有,查询的结果要包含这个表的所有字段。

这个该怎么做啊
谢谢
[attach]50408[/attach]
作者: Henry D. Sy    时间: 2012-9-17 13:34
什么意思??
作者: kent_73    时间: 2012-9-17 13:43
Henry D. Sy 发表于 2012-9-17 13:34
什么意思??


这是我要的结果(请看查询)

[attach]50409[/attach]
作者: Henry D. Sy    时间: 2012-9-17 14:04
kent_73 发表于 2012-9-17 13:43
这是我要的结果(请看查询)

你凭什么踢掉id为10的记录??
作者: kent_73    时间: 2012-9-17 14:09
因为它和ID为11的除了【收到类别】不一样,其余都一样,是重复数据。
不好意思,ID为10和11的数量应该是一样的
作者: Henry D. Sy    时间: 2012-9-17 14:40
本帖最后由 Henry D. Sy 于 2012-9-17 14:41 编辑

你到底考虑哪些字段值是一样的。
至少id和收到类别是不一样的
作者: Henry D. Sy    时间: 2012-9-17 14:47
kent_73 发表于 2012-9-17 14:09
因为它和ID为11的除了【收到类别】不一样,其余都一样,是重复数据。
不好意思,ID为10和11的数量应该是一 ...

也就是如何才叫重复记录?
作者: kent_73    时间: 2012-9-17 15:00
呵呵,是不包含ID的所有字段
作者: Henry D. Sy    时间: 2012-9-17 15:32
kent_73 发表于 2012-9-17 15:00
呵呵,是不包含ID的所有字段

这样的话,你的四条记录中没有一条是重复的
作者: kent_73    时间: 2012-9-17 16:12
本帖最后由 kent_73 于 2012-9-17 16:18 编辑

ID为10和11的,不包含ID字段的情况下,按收到类别来区分的话,重复了


唉,没仔细看数据,思路比较混乱。
查询的结果应该是:表头ID,表体ID,发出指示ID,收货数量,付款情况,付款人,付款日
作者: Henry D. Sy    时间: 2012-9-17 17:04
kent_73 发表于 2012-9-17 16:12
ID为10和11的,不包含ID字段的情况下,按收到类别来区分的话,重复了

你自己的数据都没有好好看看
就算去掉id,
表id一样18的,数量,日期也不一样!
作者: kent_73    时间: 2012-9-18 08:33
Henry D. Sy 发表于 2012-9-17 17:04
你自己的数据都没有好好看看
就算去掉id,
表id一样18的,数量,日期也不一样!

谢谢版主这么耐心的解答
可能我还是没有表述清楚

表中字段,如果表头ID、表体ID、发出指示ID、收货数量、付款情况、付款人、付款日等相同的数据可能有二条的,需要按照字段收到类别进行区分,即收到类别有二条的,只取字段值为1的;如果仅有一条(收到类别字段的值可能是1或者2),那么只需要取该条数据。

再做了一个正确的,请斑竹帮助看看。
查询中,ID=10的数据过滤了,因为它和ID=11的,按照上述输出内容,已经重复且收到类别=2,所以需要排除。


[attach]50417[/attach]
作者: roych    时间: 2012-9-18 19:17
没看懂,第10条和第11条的收货日期都不一样,凭什么认为是重复值呢?多条件剔除重复值一般建议如下:
a、导出到Excel,用数据透视表或者Countif函数处理完毕后再导入(当然,应该删除原先数据后再执行这一步)。
b、用DCount,列出。Dcount("字段","表","表头ID="&[表头ID]&" and 表体ID="&[表体ID]&"and ID<="[ID])。注意事项如下:

1、这里只列出三个条件(需要更多的条件,请根据实际设置)。其中受限条件为前面两个,即如果“表头ID”和“表体ID”都相同的话,则视为同一条记录。字段“ID”则为自动编号字段(这是必须的)。
2、计算出来大于1的即为重复值(1为第一条,2为第二条,如此类推)。
3、对于数据较多的时候,DCount会受到一定的影响,运行速度会变慢。

作者: djt    时间: 2012-9-19 08:40
select * from tb_外发_收到数量 where 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 in
  (
select 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 as UnickF from tb_外发_收到数量 group by 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 having count(*)=1
  )

UNION ALL select * from tb_外发_收到数量 where 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 in
  (
select 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 as UnickF from tb_外发_收到数量 group by 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 having count(*)=2
  ) and 收到类别='1'
作者: kent_73    时间: 2012-9-19 08:58
djt 发表于 2012-9-19 08:40
select * from tb_外发_收到数量 where 表头ID&表体ID&发出指示ID&收货数量&付款情况&付款人&付款日 in
   ...

谢谢兄台
我就是要这样的结果。

{:soso_e183:}
作者: kent_73    时间: 2012-9-19 08:58
roych 发表于 2012-9-18 19:17
没看懂,第10条和第11条的收货日期都不一样,凭什么认为是重复值呢?多条件剔除重复值一般建议如下:
a、导 ...

感谢版主一直关注,现在问题解决了
作者: djt    时间: 2012-9-19 09:45
多用子表查询会有意想不到的效果
作者: Henry D. Sy    时间: 2012-9-19 10:16
kent_73 发表于 2012-9-19 08:58
感谢版主一直关注,现在问题解决了

主要就根本不知道你所谓的重复记录是指那些字段,你表述了半天也没说清楚!!
明确了包括那些字段值一样的为重复记录,就好办理。有何必用子查询呢?
假设,不考虑id,收货日期,收到类别:
那么下面的分组查询就能达到你的目的!!
  1. SELECT Last(Tb_外发_收到数量.ID) AS ID之最后一条记录, Tb_外发_收到数量.表头ID, Tb_外发_收到数量.表体ID, Tb_外发_收到数量.发出指示ID, Tb_外发_收到数量.收货部门, Last(Tb_外发_收到数量.收货日期) AS 收货日期之最后一条记录, Tb_外发_收到数量.收货数量, First(Tb_外发_收到数量.收到类别) AS 收到类别之第一条记录, Tb_外发_收到数量.付款情况, Tb_外发_收到数量.付款人, Tb_外发_收到数量.付款日
  2. FROM Tb_外发_收到数量
  3. GROUP BY Tb_外发_收到数量.表头ID, Tb_外发_收到数量.表体ID, Tb_外发_收到数量.发出指示ID, Tb_外发_收到数量.收货部门, Tb_外发_收到数量.收货数量, Tb_外发_收到数量.付款情况, Tb_外发_收到数量.付款人, Tb_外发_收到数量.付款日;
复制代码





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3