0

我有 2 张桌子

  1. 预订

    id roomId checkinDate checkoutDate customerId

  2. 房间

    roomId 价格

我想总结每天的总金额,但我不知道如何查找和显示 checkinDate 和 checkoutDate 之间的总金额(checkinDate 和 checkoutDate 应该是用户的输入,例如 checkinDate = '2013-04- 01',结帐日期 = '2013-07-01')。我自己尝试,但我只能从 checkinDate 做。这就是我所做的:

SELECT DATE(checkinDate), SUM(price) 
FROM booking a INNER JOIN room b on a.roomID = b.roomNo 
WHERE MONTH(checkinDate) = @month and YEAR(checkinDate) = @year
GROUP BY MONTH(checkinDate), DATE(checkinDate) 

所以我得到了这样的结果

DATE(checkinDate)    SUM(price)
2013-06-01           3570
2013-06-04           650

但我想要的应该是

DATE(checkinDate)    SUM(price)
2013-06-01           3570
2013-06-02           xxxx
2013-06-03           xxxx
2013-06-04           650

即使某天没有任何收入,它也应该显示为 0。

4

2 回答 2

0

使用您提供的数据,这对我来说非常有效,我希望对您也一样:

SELECT a.checkinDate, SUM(b.price) 
FROM booking AS a LEFT JOIN room AS b on a.roomID = b.roomNo 
WHERE a.checkinDate >= '01-04-2012' AND a.checkoutDate <= '01-07-2012'
GROUP BY a.checkinDate;

由于您需要从预订表中获取每个日期的报告,因此必须使用左连接。注意日期格式,你应该得到结果。

PS:从 SQLite 3.3.6 查询

于 2013-06-09T16:12:37.840 回答
0

一种可能的解决方案是为您创建一个日历表,其中包含您可能感兴趣的每个日期的一行,然后LEFT JOIN到该表以生成您的报告。您可以在该表中定义各种其他列以帮助满足您的报告要求(例如假日标志和期间指示器)。

这是许多有关创建此类表的建议的网络帖子之一。在“mysql 日历表”上进行网络搜索会发现许多其他内容。

例如,假设您有这样一个日历表,您可以运行如下查询:

SELECT cal.calendar_date
     , SUM(b.price) 
FROM calendar cal
LEFT OUTER JOIN booking a
on a.DATE(checkinDate) = cal.calendar_date 
LEFT OUTER JOIN room b 
on a.roomID = b.roomNo 
WHERE cal.calendar_month = @month 
  and cal.calendar_year = @year
GROUP BY cal.calendar_date 

日历表真的非常有用。

于 2013-06-09T15:36:24.553 回答