当前位置: 代码迷 >> Sql Server >> SQL在一个表中找出不等于、
  详细解决方案

SQL在一个表中找出不等于、

热度:85   发布时间:2016-04-24 09:17:55.0
SQL在一个表中找出不等于、求助!
现在我有这么一个表
ID                    EHD_WayBillNo   EHD_ScanType    name  shijian1          shijian2
17707045 12435602 发件装车 孙东芳 2015-03-19 04:44:00 2015-03-19 05:01:00
17739753 13860009 发件装车 任峰 2015-03-19 07:00:00 2015-03-19 09:28:00
17737859 13860009 发件装车 刘水林 2015-03-19 07:44:00 2015-03-19 09:13:00
17740037 13860010 发件装车 任峰 2015-03-19 07:22:00 2015-03-19 09:28:00
17737861 13860010 发件装车 刘水林 2015-03-19 07:44:00 2015-03-19 09:13:00
17708507 13860011 发件装车 任峰 2015-03-19 05:18:00 2015-03-19 05:39:00
17708504 13860012 发件 任峰 2015-03-19 05:18:00 2015-03-19 05:39:00
17739715 3000071510 发件 任峰 2015-03-19 06:57:00 2015-03-19 09:28:00
17737835 3000071510 发件 刘水林 2015-03-19 07:44:00 2015-03-19 09:13:00
17706999 3000071521 发件 孙东芳 2015-03-19 04:38:00 2015-03-19 05:01:00
17708551 3000071519 发件 任峰 2015-03-19 05:25:00 2015-03-19 05:39:00
17807500 3000071522 发件 任峰 2015-03-20 07:23:00 2015-03-20 07:43:00
17823068 5718832020 发件 程年青 2015-03-20 08:59:00 2015-03-20 09:25:00
17708504 13860012 发件交单 任峰 2015-03-19 05:18:00 2015-03-19 05:39:00
17739715 3000071510 发件交单 任峰 2015-03-19 06:57:00 2015-03-19 09:28:00
17737835 3000071510 发件交单 刘水林 2015-03-19 07:44:00 2015-03-19 09:13:00
17706999 3000071521 发件交单 孙东芳 2015-03-19 04:38:00 2015-03-19 05:01:00
17708551 3000071519 发件交单 任峰 2015-03-19 05:25:00 2015-03-19 05:39:00
17807500 3000071522 发件交单 任峰 2015-03-20 07:23:00 2015-03-20 07:43:00
17823068 5718832020 发件交单 程年青 2015-03-20 08:59:00 2015-03-20 09:25:00
.... 省略 数据 下面数据很多  EHD_ScanType    就扫描类型不一样 比如 有  签收,回单,收件,到件卸车 等等...
1.我先用
select EHD_WayBillNo
from dbo.E_HDTracking
where EHD_ScanType='收件'  and  EHD_ScanTime between '2015-03-18 00:00' and '2015-03-20 23:59'

查询出所以收件的记录,现在 我要查处 我这些收件里面有多少是没有 发件装车的 都是在同一张表中的!
有收件装车
我会写 
select *
from E_HDTracking
where EHD_WayBillNo in(select EHD_WayBillNo
from dbo.E_HDTracking
where EHD_ScanType='收件' and EHD_ScanTime between '2015-03-18 00:00' and '2015-03-20 23:59')
and EHD_ScanType = '发件装车'

这样是查询有发件装车的数据  现在我是要查询没有收件装车的数据
------解决思路----------------------

SELECT
       a.*
FROM      (
              SELECT *
              FROM dbo.E_HDTracking
              WHERE EHD_ScanType='收件' AND EHD_ScanTime BETWEEN '2015-03-18 00:00' AND '2015-03-20 23:59'
          ) a
LEFT JOIN (
              SELECT
                     EHD_WayBillNo
              FROM dbo.E_HDTracking
              WHERE EHD_ScanType = '发件装车'
          ) b ON a.EHD_WayBillNo = b.EHD_WayBillNo
WHERE b.EHD_WayBillNo IS NULL

------解决思路----------------------
把IN 改成NOT IN即可
------解决思路----------------------
我不清楚你的具体逻辑,可能没那么简单

但是从直观的逻辑上看,收件的相反的集合不就是非收件嘛,即没有收件,自然NOT IN就可以了

如果你有些状态虽然不是收件,但是那个状态也已经是收件了的话,把这些也过滤出来即可
------解决思路----------------------
EHD_ScanTyp 这是一个状态 ,一条数据里边只能有一个状态 ,你要从  EHD_ScanType='收件'  的数据中搜索    EHD_ScanType = '发件装车' 肯定是查不出来数据的 
------解决思路----------------------
SELECT DISTINCT   EHD_ScanType  看下, 虽然没弄懂楼主要求,但感觉应该了字符串操作差不多,应该有解吧
------解决思路----------------------
SELECT t1 AS (
    select EHD_WayBillNo
      from dbo.E_HDTracking
     where EHD_ScanType='收件'
       and EHD_ScanTime between '2015-03-18 00:00'
                            and '2015-03-20 23:59'
)
,t2 AS (
    select EHD_WayBillNo
      from dbo.E_HDTracking
     where EHD_ScanType='发件装车'
       and EHD_ScanTime between '2015-03-18 00:00'
                            and '2015-03-21 23:59' --假定第二天必定发件装车了
)
    SELECT t1.EHD_WayBillNo
      FROM t1
 LEFT JOIN t2
        ON t1.EHD_WayBillNo = t2.EHD_WayBillNo
     WHERE t2.EHD_WayBillNo IS NULL

------解决思路----------------------
根据你实际业务调整t2中的时间啊。
假如不怕搜索范围大的话可以直接用: EHD_ScanTime >= '2015-03-18 00:00'

------解决思路----------------------
你要的是,EHD_ScanType='收件' 的 EHD_WayBillNo 中,EHD_ScanType 没有是 “发件装车”?

select EHD_WayBillNo 
from dbo.E_HDTracking
where  EHD_ScanType='收件'  and EHD_WayBillNo  not in (select EHD_WayBillNo from dbo.E_HDTracking where EHD_ScanType='发件装车' )

  相关解决方案