2016-09-01 19 views
1

私は、次の表を持っている:TSQL:条件付きクエリ

| RoomID | OrderID | Occupancy | rn | 
+--------+---------+-----------+----+ 
| 01  | 101  | Vacant | 1 | 
| 01  | 102  | Occupied | 2 | 
| 01  | 103  | Occupied | 3 | 
| 01  | 104  | Vacant | 4 | 
| 02  | 201  | Vacant | 1 | 
| 02  | 202  | Occupied | 2 | 
| 02  | 203  | Vacant | 3 | 
| 03  | 301  | Vacant | 1 | 
| 03  | 302  | Occupied | 2 | 
| 03  | 303  | Occupied | 3 | 
| 03  | 304  | Occupied | 4 | 
| 04  | 401  | Occupied | 1 | 
| 04  | 402  | Occupied | 2 | 
| 04  | 403  | Vacant | 3 | 
| 04  | 404  | Occupied | 4 | 

私は次のrequirmentsのすべてが「はい」として満たされていると1つ以上の要件が "として満たされていない場合RoomIDのフラグを必要としますいいえ '

  • rn = 2 Occupancy
  • を占められている場合 rn = 1 Occupancy
  • 空いています2より大きい
  • どれrn(3,4,5 ...)空いている

Occupancyを持っている結果は次のようになります。

| RoomID | OrderID | 
+--------+---------+ 
| 01  | Yes  | 
| 02  | Yes  | 
| 03  | No  | 
| 04  | No  | 

私はこれが簡単であるという印象を持っていますが、私は現時点でそれを見ることができません、あなたの助けを事前に感謝!

+2

あなたはそれを解決しようとしていますか? –

+0

各「RoomID」または「RoomID」と「OrderID」の組み合わせごとに「はい」または「いいえ」を設定しますか? – DVT

+0

@DVTルームIDのみ。 –

答えて

1
SELECT RoomID, 
CASE WHEN ((rn = 1 OR rn > 2) AND Occupancy = 'Vacant') AND (rn = 2 AND Occupancy = 'Occupied') THEN 'Yes' ELSE 'No' END 
FROM Table_Name  

は、 'はい'>行ごとにルールを計算する場合を 'いいえ'

0

条件付き集計を使用して各条件を確認できます。

with roomquery as (
    select RoomId, 
      min(case when rn<>2 and Occupancy='vacant' then 1 else 0 end) cond1, 
      min(case when rn=2 and Occupancy='Occupied' then 1 else 0 end) cond2 
    from rooms r 
    group by RoomId) 
select RoomId, 
     case when Cond1=1 and Cond2=1 then 'Yes' else 'No' end Status 
from roomquery 

注:あなたがそれを書き換えると、1つの条件のみまたは前夜は完全に(声明で)CTEを削除する使用しますが、私は、これは、より読みやすく、保守性であると考えていることができます。

0

これはあなたに役立つと思います。

1
select RoomId, 
     min(case when rn<>2 and Occupancy='vacant' 
       or rn=2 and Occupancy='Occupied' 
      then 'Yes' else 'No' end) res 
from myTable 
group by RoomId 

上に構築します。
(room_idでグループ化された)ルールの最小値が0の場合、少なくとも1つはルールに従わなかった。ここで

SELECT RoomID, 
IIF(MIN(
    CASE 
    WHEN rn <> 2 AND Occupancy = 'Vacant' THEN 1 
    WHEN rn = 2 AND Occupancy = 'Occupied' THEN 1 
    ELSE 0 
    END)=0,'No','Yes') as OccupancyRule 
FROM RoomOccupancyTable 
GROUP BY RoomID; 
0

は「はい」サブクエリにRoomIDあたり違反の数をカウントしてから印刷する別の答えではないか、「なし」に応じて:ここでテスト

SELECT sub.roomid, 
CASE WHEN sum(sub.orderid_no) IS NOT NULL THEN 'No' 
ELSE 'Yes' 
END AS orderID 
FROM 
(SELECT roomid, 
CASE WHEN rn = 1 AND occupancy = 'occupied' THEN 1 
WHEN rn = 2 AND occupancy = 'vacant' THEN 1 
WHEN rn > 2 AND occupancy = 'occupied' THEN 1 
END AS orderid_no 
FROM T) sub 
GROUP BY sub.roomid 

:またhttp://sqlfiddle.com/#!9/d9d467/14

上記のあなたの出力は間違っていると思います。あなたのデータによると、RoomID 01はOrderID "No"を持っているはずです