我需要查询表格中所有日期的拍摄室。
我的表数据是
-----------------------------------
|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号房间,因此不需要。
答案 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)
*/