使用MySql按日期汇总数据

时间:2017-03-15 14:45:24

标签: php mysql sql

我正在尝试为我的公司报告财务数据:

我的表格为___BillableDatas,如下所示:

|--------|------------|----------|----------|--------------|
| BIL_Id | BIL_Date   | BIL_Type | BIL_Rate | BIL_Quantity |
|--------|------------|----------|----------|--------------|
| 1      | 2017-01-01 | Night    | 95       | 1            |
| 2      | 2017-01-02 | Night    | 95       | 1            |
| 3      | 2017-01-15 | Night    | 105      | 1            |
| 4      | 2017-01-15 | Item     | 8        | 2            |
| 5      | 2017-02-14 | Night    | 95       | 1            |
| 6      | 2017-02-15 | Night    | 95       | 1            |
| 7      | 2017-02-16 | Night    | 95       | 1            |
| 8      | 2017-03-20 | Night    | 89       | 1            |
| 9      | 2017-03-21 | Night    | 89       | 1            |
| 10     | 2017-03-21 | Item     | 8        | 3            |
|--------|------------|----------|----------|--------------|

我想得到什么:

  • 第01个月(1月)= 311.00$(95 + 95 + 105 + 8 + 8)

  • 第02个月(2月)= 295.00$(95 + 95 + 95)

  • 第03个月(3月)= 202.00$(89 + 89 + 8 + 8 + 8)

  • 第04个月(4月)= 0.00$

  • 第05个月(5月)= 0.00$

  • ...

是否可以使用mySQL实现?

我是否需要进行多次查询,或者我可以在一个查询中进行查询?

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

SELECT MONTH(BIL_Date) as Month, SUM(BIL_Rate*BIL_Quantity) as Total FROM ___BillableDatas GROUP BY YEAR(BIL_Date), MONTH(BIL_Date)

没有测试过,但这应该是正确的查询。它将返回月份和当月的金额。

答案 1 :(得分:0)

使用子查询首先调整数据会使查询更容易在以后操作(如果需要)

select a1.Period, 
       sum(a1.BIL_Rate_x) as Total_Amount
from 
  (
  select date_format(BIL_Date, '%Y %m') as Period, BIL_Rate * BIL_Quantity as BIL_Rate_x
  from `___BillableDatas`
  ) a1
group by a1.Period

答案 2 :(得分:0)

您需要使用MONTH()功能和group by之类的

select month(BIL_Date) as month,
sum(BIL_Rate * BIL_Quantity) as sumval
from `___BillableDatas`
group by year(BIL_Date), month(BIL_Date);

答案 3 :(得分:0)

我认为你也应该按年分组,除非你每年都有一张桌子

SELECT YEAR(BilDate) AS BillYear, MONTH(BilDate) AS BillMonth, SUM(BilRate * BilQuantity) AS Total
FROM __BillableDatas
GROUP BY YEAR(BilDate), MONTH(BilDate)

答案 4 :(得分:0)

你可以用这个来实现类似的东西

select  month(BIL_DATE),
        sum(BIL_RATE * BIL_QUANTITY)
from    ___BillableDatas
group by year(BIL_DATE), month(BIL_DATE)

但它未来几个月都不会返回0。 为了得到这些,你应该有一个包含所有月份的查找表,并在该表与此查询的结果之间执行left join,例如

select  t1.month, coalesce(t2.bill, 0)
from    months t1
left join (
            select  year(BIL_DATE) year,
                    month(BIL_DATE) month,
                    sum(BIL_RATE * BIL_QUANTITY) bill
            from    ___BillableDatas
            group by year(BIL_DATE), month(BIL_DATE)
        ) t2
on      t1.month = t2.month and
        t1.year = t2.year

修改

如果您想在应用程序级别操作数据,并且已经有几个月的数组,您可以在地图['month' -> 'bill']中获取第一个查询的结果,然后遍历您的月份数组,例如

for (month in months){
    if(map[month] == null){
        map.add(month, 0);
    }
}

请注意,这只是伪代码,因为我不熟悉PHP。