如何获取日期之间的金额总和并显示消失的日期?

时间:2013-06-09 14:42:40

标签: mysql

我有2张桌子

  1. 预订

    id roomId checkinDate checkoutDate customerId

  2. roomId价格

  3. 我想总结一下每天的总金额,但我不知道如何找到并显示checkinDate和checkoutDate之间的差距总和(checkinDate和checkoutDate应该是来自用户的输入,例如checkinDate ='2013 -04-01',checkoutDate ='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。

2 个答案:

答案 0 :(得分:0)

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

Here is one of many 网络帖子,其中包含有关创建此类表格的建议。对“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 

日历表非常有用。

答案 1 :(得分: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;

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

P.S。:来自SQLite 3.3.6的查询