我正在尝试为我的公司报告财务数据:
我的表格为___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实现?
我是否需要进行多次查询,或者我可以在一个查询中进行查询?
感谢您的帮助。
答案 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。