Sql查询过滤器

时间:2016-02-23 08:39:56

标签: sql sql-server sql-server-2008 select

我需要查询表格中所有日期的拍摄室。

我的表数据是

-----------------------------------
|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号房间,因此不需要。

3 个答案:

答案 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

答案 1 :(得分: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

答案 2 :(得分: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)
*/