我有一张交易表,
History[CustomerID, BikeID,Checkout,StationIDout,Checkin,StationIDin]
其中Checkout
和Checkin
为GETDATE()
我想查询History
,以便我收到当前位于给定StationID的自行车(即Checkin
和StationIDin
为NOT NULL
)
我目前正在使用此查询:
SELECT DISTINCT BikeID from History
where StationIDin = {0}
AND Checkin IS NOT NULL AND StationIDin IS NOT NULL
毫不奇怪,我仍在接收已签出的自行车,因为我的查询选择了一个已完成的交易所看到的第一个BikeID
,而没有搜索另一个未重新检入相同自行车的实例。 / p>
我想形成一个查询 NOT 选择BikeID
签出的查询。换句话说,要在StationIDin中搜索任何NULL,并在选择BikeID
之前将其从结果中删除。
(我为可能误导标题而道歉,我无法更好地描述它)
CustomerID BikeID Checkout StationIDout Checkin StationIDin
--------------------------------------------------------------------
1001 32 6/8/16 500 6/28/16 500
1002 21 1/2/15 500 1/3/15 500
1003 32 3/7/15 500 NULL NULL
CURRENT OUTPUT:
32
21
DESIRED OUTPUT:
21
答案 0 :(得分:2)
使用GROUP BY
,而不是SELECT DISTINCT
:
SELECT BikeID
FROM History h
WHERE StationIDin = {0}
GROUP BY BikeId
HAVING SUM(CheckIn IS NULL) = 0;
这会将所有没有CheckIn
记录的自行车返回为NULL
。
答案 1 :(得分:1)
使用自我加入来过滤掉与自行车ID相匹配的结果,并且他们没有签到。
SELECT DISTINCT h1.BikeID
FROM History AS h1
LEFT JOIN History AS h2 ON h1.BikeID = h2.BikeID AND (h2.Checkin IS NULL OR h2.StationIDin IS NULL)
WHERE h1.Checkin IS NOT NULL AND h2.StationIDin IS NOT NULL
AND h2.BikeID IS NULL