2016-02-23 4 views
1

Мне нужно запросить номер, который присутствует во всех датах со стола.Sql Query Filter

Мои данные таблицы

----------------------------------- 
|Room No | Date   | Type | 
----------------------------------- 
|1  | 1 JAN 2016 | AC  | 
|2  | 1 JAN 2016 | AC  | 
|3  | 1 JAN 2016 | Non AC | 
|1  | 2 JAN 2016 | AC  | 
|3  | 2 JAN 2016 | AC  | 
|1  | 3 JAN 2016 | AC  | 
|2  | 3 JAN 2016 | AC  | 
|3  | 3 JAN 2016 | Non AC | 

Теперь я хочу, чтобы результат Подобно

------------------------ 
| RoomNo | Type | 
------------------------ 
| 1   | AC  | 
| 3   | NON AC | 

Смотрите выше пример номер не 2 не не присутствует на 2 января, так что это не требуется.

+1

назначение школы? Что вы пробовали? (Возможно, 'GROUP BY'?) – jarlh

+0

Использовать' GROUP BY Type' нет? – simon

+0

Какая группа Не проверяет всю датированную дату –

ответ

1

Один из способов подойти к этой проблеме, чтобы сравнить количество уникальных дат номер имеет к общему количеству уникальных дат:

SELECT room_no, type 
FROM  (SELECT room_no, type, COUNT(DISTINCT date) AS cnt 
      FROM  rooms 
      GROUP BY room_no, type) r 
JOIN  (SELECT COUNT(DISTINCT date) AS cnt 
      FROM rooms) c ON r.cnt = c.cnt 
+0

Я могу получить ответ из вашего запроса, но, пожалуйста, вы можете объяснить это, я не могу понять –

+0

Первый query (aliased as 'r') возвращает определенное количество дат в комнате. Второй запрос (псевдоним как 'c') возвращает общее количество дат в таблице. Если они равны (условие соединения), это означает, что комната занята в каждый день, который представлен в таблице. – Mureinik

1

Есть много способов, как это представляет острова и пробела проблемы, предполагая, у вас есть три комнаты, вы просто хотите, чтобы дать какое-то значение, если есть разрыв в

select row_number() ovver (partition by date order by roomno) as rn, 
roomno,type 
from 
yourtable 

теперь вы можете выбрать все номера, которые забронированы каждый день, используя

with cte 
    as 
    (
    select row_number() ovver (partition by date order by roomno) as rn, 
     roomno,type 
     from 
     yourtable 
    ) 
select * from cte where rn=3 

не забронированные номера с использованием

 with cte 
     as 
     (
     select row_number() ovver (partition by date order by roomno) as rn, 
      roomno,type 
      from 
      yourtable 
     ) 


    select * from cte where rn<3 
+0

Этот запрос работает только при наличии 3 дат? как если будет более трех дат? например, дата 1,2,3,4,5 января 2016 года? – Mark

+0

НЕТ Я просто приведу пример actall, я получу до 60 или 90 дат также –

+0

, пожалуйста, обновите свой вопрос, чтобы быть конкретным – TheGameiswar

1
/* 
My Sql Server Version:Microsoft SQL Server 2012 
The code below can run at above 2005 
*/ 
--Step1:Initialize DataTable 
select * from (VALUES(1,cast('1 JAN 2016' as Date),'AC') 
        ,(2,cast('1 JAN 2016'as Date),'AC') 
        ,(3,cast('1 JAN 2016'as Date),'Non AC') 
        ,(1,cast('2 JAN 2016'as Date),'AC') 
        ,(3,cast('2 JAN 2016'as Date),'AC') 
        ,(1,cast('3 JAN 2016'as Date),'AC') 
        ,(2,cast('3 JAN 2016'as Date),'AC') 
        ,(3,cast('3 JAN 2016'as Date),'Non AC') 
        ) as a(RoomNo,Date,Type) 
-- result 
/* 
RoomNo  Date  Type 
----------- ---------- ------ 
1   1 JAN 2016 AC 
2   1 JAN 2016 AC 
3   1 JAN 2016 Non AC 
1   2 JAN 2016 AC 
3   2 JAN 2016 AC 
1   3 JAN 2016 AC 
2   3 JAN 2016 AC 
3   3 JAN 2016 Non AC 

(8 row(s) affected) 

*/ 
--Step2: The Result 
--Solution A: 
;with FilterResult as (
select RoomNo,Type,Row_Number() over(partition by RoomNo order by Date) as rn 
from (VALUES(1,cast('1 JAN 2016' as Date),'AC') 
        ,(2,cast('1 JAN 2016'as Date),'AC') 
        ,(3,cast('1 JAN 2016'as Date),'Non AC') 
        ,(1,cast('2 JAN 2016'as Date),'AC') 
        ,(3,cast('2 JAN 2016'as Date),'AC') 
        ,(1,cast('3 JAN 2016'as Date),'AC') 
        ,(2,cast('3 JAN 2016'as Date),'AC') 
        ,(3,cast('3 JAN 2016'as Date),'Non AC') 
        ) as a(RoomNo,Date,Type) 
) 
select RoomNo,Type 
from FilterResult 
where rn = 3 
--result 
/* 
RoomNo  Type 
----------- ------ 
1   AC 
3   Non AC 

(2 row(s) affected) 
*/      
--Solution B: 
;with SourceTable as(
select * from (VALUES(1,'1 JAN 2016','AC') 
        ,(2,'1 JAN 2016','AC') 
        ,(3,'1 JAN 2016','Non AC') 
        ,(1,'2 JAN 2016','AC') 
        ,(3,'2 JAN 2016','AC') 
        ,(1,'3 JAN 2016','AC') 
        ,(2,'3 JAN 2016','AC') 
        ,(3,'3 JAN 2016','Non AC') 
        ) as a(RoomNo,Date,Type) 
), 
FilterResult as (
select RoomNo,max(Date) as Date from SourceTable 
group by RoomNo 
having count(Date) =3 
) 
select a.RoomNo,b.Type 
from FilterResult as a inner join SourceTable as b on a.RoomNo = b.RoomNo and a.Date = b.Date 
--Result 
/* 
RoomNo  Type 
----------- ------ 
1   AC 
3   Non AC 

(2 row(s) affected) 
*/