2016-06-28 11 views
1

から存在している場合、私は現在バイクを受け取ることができるように、Historyを照会するCheckoutCheckinGETDATE()NULL列は、私は、トランザクションのテーブルを持っているSELECT

ある

History[CustomerID, BikeID,Checkout,StationIDout,Checkin,StationIDin] 

を個別の行を削除します(すなわち、CheckinStationIDinNOT NULLです)

私のクエリはどこに同じ自転車、それは別のインスタンスを検索せずに完了したトランザクションを見て最初BikeIDを選ぶので、

SELECT DISTINCT BikeID from History 
where StationIDin = {0} 
AND Checkin IS NOT NULL AND StationIDin IS NOT NULL 

は驚くことではないが、私はまだチェックアウトされているバイクを受けています:私は現在、このクエリを使用しています

NOT選択BikeIDをチェックアウトしたクエリを作成したいと思います。言い換えれば、StationIDin内のNULLの出現を検索し、BikeIDを選択する前に結果からそれを削除することです。

(潜在的にタイトルをmisnamingための私の謝罪は、私はより良いそれを記述することはできません)

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

サンプルデータと予想される結果を投稿できますか? –

+0

すべてのデータを1つのテーブルに保存しますが、これは正しい方法ではありません。そして、エラーが起こりやすいです。デザインを見直し、テーブル内の各自転車の現在のステータスとその履歴を別のテーブルに保存します。現在のステータステーブルでは、各バイクは正確に1回表示されなければなりません。履歴表では、自転車は0回以上出現することがあります。 – axiac

答えて

2

使用GROUP BY、ないSELECT DISTINCT

SELECT BikeID 
FROM History h 
WHERE StationIDin = {0} 
GROUP BY BikeId 
HAVING SUM(CheckIn IS NULL) = 0; 

このretu CheckInと記録を持たないすべての自転車はNULLです。

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 
関連する問題