Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.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 先按一个字段分组,然后按另一个字段分组_Sql_Sql Server - Fatal编程技术网

Sql 先按一个字段分组,然后按另一个字段分组

Sql 先按一个字段分组,然后按另一个字段分组,sql,sql-server,Sql,Sql Server,我有一张表,上面列出了客户预订的信息。我需要将住在同一房间的客户分组(通过使用相同的共享代码来识别)。但是,我还需要能够根据他们的预订号(每个人的预订都是唯一的)搜索其他表 我有下面的查询,它提取每个预订并列出他们的到达日期、离开日期、他们住的房间、预订的人数以及他们花费的金额。以下是查询: SELECT c.reservation_number, c.arrival_date, c.departure_date, r.room_type_code, p.number_of_persons, S

我有一张表,上面列出了客户预订的信息。我需要将住在同一房间的客户分组(通过使用相同的
共享代码来识别)。但是,我还需要能够根据他们的
预订号
(每个人的预订都是唯一的)搜索其他表

我有下面的查询,它提取每个预订并列出他们的到达日期、离开日期、他们住的房间、预订的人数以及他们花费的金额。以下是查询:

SELECT c.reservation_number, c.arrival_date, c.departure_date, r.room_type_code, p.number_of_persons, SUM(r.room_revenue + r.package_revenue) AS amount, SUM(r.spa_revenue) AS spa_revenue
FROM nw_src.dbo.customer_res c
JOIN nw_src.dbo.customer_resx p ON c.reservation_number = p.reservation_number
JOIN nw_src.dbo.res_revenue r ON c.reservation_number = r.reservation_number
WHERE c.cancellation_number = 0
GROUP BY c.reservation_number, c.arrival_date, c.departure_date, r.room_type_code, p.number_of_persons
ORDER BY c.reservation_number
这将逐一列出每个预订。如果
customer\u res
中的
sharr\u代码
相同,我需要将它们分组。以下是
customer\u res
表的示例:

预订号|到达日期|出发日期|共享代码
10002            2017-04-21      2017-04-23        10004
10003            2017-04-11      2017-04-12            0
10004            2017-04-21      2017-04-23        10004
10008            2017-04-21      2017-04-23        10004
10009            2017-05-06      2017-05-08            0
10010 2017-04-28 2017-04-30 10010

在上述情况下,预订
10002
10008
位于一组中,但位于由
sharer\u code
标识的单独预订(或不同票据)上。他们的团体预订被分配了号码“10004”

预订
10003
10009
是可以分组或不分组的人,但两种方式都在一张账单上,因此不会有其他预订号码来分组

以下是
customer\u resx
表的示例:

预订人数|人数|
10002                 1
10003                 4
10008                 1
10009 2

这有助于澄清上述问题
10002和
10008
住在同一个房间,但有单独的账单,所以他们每个预订只有“1”人。然而
10003
10009
也有多人住在一个房间里,但他们都在一张账单上(或“预订”)

以下是
res\u revenue
表的示例:

预订号|房间类型|代码|房间收入|套餐收入|水疗收入|
10002 1cat-150 560 195
10002 1cat-150 560 315
10002 1cat 0 0 190
10003 1dol 236 1120 400
10003 1dol 0 245
10008 1cat-150 560 125
10008 1cat-150 560 290
10008 1cat 0 0 120
10009 1cyn 332.8 591.2 20
10009 1cyn 332.8 591.2 390
10009 1cyn 0 230

这是非常清晰的地方
10002和
10008
都在
1cat
中,这意味着他们是一个群体,我们需要将他们全部分组
10003
在他们自己的房间里,
1dol
。而
10009
1cyn

最后,我希望结果集是这样的:

预订号|到达日期|出发日期|房间类型|代码|人数|人数|金额|水疗收入|
10002 2017-04-21 2017-04-23电话号码1640 1235
10003 2017-04-11 2017-04-12一道菜1356 645
10009 2017-05-06 2017-05-08 1cyn 2 1848 640


请注意,
预订号可以是
10002
10004
10008
。这可能类似于
MIN
sharr\u code
、或
MAX

TLDR,因为很难理解,但看起来您希望在
CTE
中进行初始聚合,然后再次聚合该结果集(当然有不同的分组)您有重新设计数据库的选项吗?我觉得如果你能规范化其中的一些表,你会有一个更轻松的时间。例如,为什么在res_revenue中重复预订号码?@mallan1121不幸的是,我没有这个选项,或者我会有,相信我。