返回基于前5个字符的结果

时间:2016-03-31 11:51:39

标签: sql-server sql-server-2008

我有一个包含OrderId (int), ordernum varchar(50), pickup varchar(50) , dropoff varchar(50),DADDR varchar(50) ,DRV1NUM varchar(10),READYDATE datetime列的表ORDE_,我正在尝试获取以下条件的值where there the first 5 characters of ORDE_.DADDR are the same and there is more than one ORDE_.DRV1NUM for the orders with the same 5 first characters of ORDE_.DADDR

我尝试以下查询,但没有给我正确的值

SELECT ordernum, pickup, dropoff,DADDR,DRV1NUM,READYDATE FROM orde_ 
WHERE substring(DADDR,1,5) IN (
  SELECT substring(DADDR,1,5)
  FROM orde_
GROUP BY substring(DADDR,1,5)
HAVING COUNT(*) > 1)
 AND READYDATE ='01/18/2016'
 AND DISPID=56 
 AND DADDR <> ''
 ORDER BY DADDR DESC
你可以帮我解决这个问题吗?谢谢你的时间

你可以这样理解

DADDR            DRV1NUM
------           -------
ABCD             1214
ABCD             1214
ABCD             1215
AACD             1216
AACD             1216
AACD             1218
AAAA             12121
AAAA             12121
AAAA             12121

OUTPUT将

DADDR            DRV1NUM
------           -------
ABCD             1215
AACD             1218

因为相同的DADDR With有超过1个DRV1NUM

1 个答案:

答案 0 :(得分:1)

这将为您提供所有行,其中DADDR的前5个字符与DRV1NUM的前5个字符至少有一个匹配。

;WITH CTE as
(
  SELECT
    ordernum, pickup, dropoff,DADDR,DRV1NUM,READYDATE,
    count(*) over (partition by LEFT(DADDR,5), LEFT(DRV1NUM,5)) cnt1,
    count(*) over (partition by LEFT(DADDR,5)) cnt2
  FROM orde_ 
  WHERE
    READYDATE ='2016-01-18'
    AND DISPID=56 
    AND DADDR <> ''
)
SELECT
 ordernum, pickup, dropoff,DADDR,DRV1NUM,READYDATE
FROM CTE
WHERE
  cnt1 = 1
  AND cnt2 > 1