我有预订表,我有数据
GUEST_NO HOTEL_NO DATE_FROM DATE_TO ROOM_NO
1 1 2015-05-07 2015-05-08 103
1 1 2015-05-11 2015-05-12 104
1 1 2015-05-14 2015-05-15 103
1 1 2015-05-17 2015-05-20 101
2 2 2015-05-01 2015-05-02 204
2 2 2015-05-04 2015-05-05 203
2 2 2015-05-17 2015-05-22 202
我想要的是得到结果。 1)它应该显示输出为Guest_no,Hotel_no,Room_no和列,其中count为前三列组合重复的时间。
所以OutPut应该
GUEST_NO HOTEL_NO ROOM_NO Count
1 1 103 2
1 1 104 1
1 1 101 1
2 2 204 1
等。但我想以有序的方式得到结果,例如:输出应为order by bk.date_to desc
我的查询如下显示我的数量,但是如果我使用订单不工作
select bk.guest_no, bk.hotel_no, bk.room_no,
count(bk.guest_no+bk.hotel_no+bk.room_no) as noOfTimesRoomBooked
from booking bk
group by bk.guest_no, bk.hotel_no, bk.room_no, bk.date_to
order by bk.date_to desc
因此,按结果添加顺序显示不同,因为我按date_to列添加了顺序,所以我必须添加此列也是group by子句,这将最终导致不同的结果如下所示
GUEST_NO HOTEL_NO ROOM_NO Count
1 1 103 1
1 1 104 1
1 1 103 1
1 1 101 1
2 2 204 1
这不是我想要的输出。 我想要这四列,但是按照date_to列的desc顺序计算,并且计为前三列的重复次数
答案 0 :(得分:6)
我认为这样做的一个好方法是按guest_no,hotel_no和room_no分组,并按每组中的最大(即最近)预订日期排序。
SELECT
guest_no,
hotel_no,
room_no,
COUNT(1) AS BookingCount
FROM
booking
GROUP BY
guest_no,
hotel_no,
room_no
ORDER BY
MAX(date_to) DESC;
答案 1 :(得分:2)
也许这就是你要找的东西?
select
guest_no,
hotel_no,
room_no,
count(*) as Count
from
booking
group by
guest_no,
hotel_no,
room_no
order by
min(date_to) desc
或者可能是max()而不是min()。 SQL小提琴:http://sqlfiddle.com/#!6/e684c/3
答案 2 :(得分:0)
你可以试试这个。
select t.* from
(
select bk.guest_no, bk.hotel_no, bk.room_no, bk.date_to,
count(*) as noOfTimesBooked from booking bk
group by bk.guest_no, bk.hotel_no, bk.room_no, bk.date_to
) t
order by t.date_to
您还必须选择date_to,然后按结果对结果进行分组。 如果您使用'group by'子句,SQL Server不允许您使用'order by'。因此,您可以创建子查询并在外部查询中使用“order by”。
答案 3 :(得分:0)
SELECT * FROM
(select bk.guest_no,bk.hotel_no,bk.room_no
,count(bk.guest_no+bk.hotel_no+bk.room_no) as noOfTimesRoomBooked,
(SELECT MAX(date_to) FROM booking CK
WHERE CK.guest_no=BK.guest_no AND bk.hotel_no=CK.bk.hotel_no
bk.room_no=CK.ROOM_NO ) AS DATEBOOK
from booking bk
group by bk.guest_no,bk.hotel_no,bk.room_no,bk.date_to) A
ORDER BY DATEBOOK
它可能会帮助你