Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询按数据分组,但带有order by子句_Sql_Sql Server - Fatal编程技术网

SQL查询按数据分组,但带有order by子句

SQL查询按数据分组,但带有order by子句,sql,sql-server,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 201

我预订了有数据的桌子

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
1                1              103   2
1                1              104   1
1                1              101   1
2                2              204   1
等等,但我希望结果以有序的方式显示,例如:输出应该是按bk.date\u排序到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
所以添加order by result会显示出不同的结果,因为我将order by date_添加到列中,所以我必须添加此列也是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
这不是我想要的输出。 我想要这四列,但按日期描述顺序排列到第列,并计算为前三列的重复次数

您可以试试这个

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”

 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

这可能会对您有所帮助

我认为一个很好的方法是按客人号、酒店号和房间号进行分组,并按每组的最大(即最近)预订日期进行排序

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;

也许这就是你要找的

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 FIDLE:

您的意思是,您在没有order BY的情况下得到了正确的结果(订单除外),但是当您添加order BY时,您会得到另一个结果吗?还是仅仅是“不起作用”的命令?请在没有订单和有订单的情况下显示结果。此外,您还可以将bk.date_添加到选择列表中,以使事情更清楚。您在编写“如果使用'group by'子句,SQL不允许…”时是指SQL Server吗?@jarlh Yes。如果在同一查询库中同时使用“分组依据”和“订单依据”进行澄清,则会出现错误!