SQL查询按数据分组但按顺序排列

时间:2015-05-17 08:57:48

标签: sql sql-server

我有预订表,我有数据

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顺序计算,并且计为前三列的重复次数

4 个答案:

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

它可能会帮助你