Mysql 汇总每周收入,包括空记录

Mysql 汇总每周收入,包括空记录,mysql,sql,subquery,Mysql,Sql,Subquery,我试图总结一个时间管理系统(PHP/MySQL)的每周收入,但是这个SQL查询有很多问题。基本上,我需要返回过去8周的收入总和,包括没有收入的几周记录,但如果我在WHERE子句中添加任何内容,将其缩小到特定类型的任务,我就无法实现这一点。此查询涉及三个表: tbltask存储有关任务的信息,包括记录任务的日期、执行任务的用户、应计费的时间以及任务是否可计费(有些任务不可计费,应排除在收入计算之外) tbluser存储用户信息,所以我需要加入它以获得每小时的付费率 user_id payrat

我试图总结一个时间管理系统(PHP/MySQL)的每周收入,但是这个SQL查询有很多问题。基本上,我需要返回过去8周的收入总和,包括没有收入的几周记录,但如果我在WHERE子句中添加任何内容,将其缩小到特定类型的任务,我就无法实现这一点。此查询涉及三个表:

tbltask存储有关任务的信息,包括记录任务的日期、执行任务的用户、应计费的时间以及任务是否可计费(有些任务不可计费,应排除在收入计算之外)

tbluser存储用户信息,所以我需要加入它以获得每小时的付费率

user_id   payrate   
--------------------
1         50
2         75          
日历只是一个具有广泛日期范围的表,因此我可以加入它,并为没有记录的日期生成结果

datefield 
--------------------
2013-01-01
2013-01-02
2013-01-03
[...]
2025-12-31
下面是我到目前为止所掌握的信息,为我提供了相关日期前8周内每个人每周(从周一开始)的总收入。这似乎像预期的那样工作,但计算所有任务,而不仅仅是计费任务。如果这几周没有记录任何任务,我会得到返回的记录,其中0为总收入,这一点很重要,因为我需要过去8周的记录,即使没有记录时间

SELECT FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) AS first_day, 
SUM( IFNULL( time_est /60 * payrate, 0 ) ) AS total_earned
FROM calendar
LEFT JOIN tbltask ON tbltask.date_logged = calendar.datefield
LEFT JOIN tbluser ON tbltask.user_id = tbluser .user_id
WHERE datefield <=  '2014-12-26'
GROUP BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) 
ORDER BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) DESC 
LIMIT 8
选择从天(到天(日期字段)-MOD(到天(日期字段)-2,7)作为第一天,
作为总收入的总和(如果为空(时间估计/60*工资率,0))
从日历
在tbltask.date\U logged=calendar.datefield上左键加入tbltask
在tbltask.user_id=tbluser.user_id上左键加入tbluser

WHERE datefield请原谅,我没有创建表来运行查询。所以我不能调试你所拥有的

但是,, (A) 您可以创建tbltasks.wkyear,这将消除对其中一个表的需要。 这可以通过插入触发器存储(可能是默认值?)。或者干脆写下来

B) 我想我不确定你的目标? 我想我现在有半个线索了

我认为SELECT IF(bilable=1,50,0)是您的朋友。

选择年周('1987-01-01');
->198653

我认为我无法使用tbltask.wkyear获得我想要的结果,因为如果没有记录任何任务,我仍然会遇到无法获取数周记录的问题。这就是为什么我有日历表,所以我可以查询日期,没有一个会被遗漏,然后填写我的数据(除非有更好的方法,但这是我发现的建议的方法)。我成功地用IF()实现了我想要的查询,谢谢!我会更新问题的细节。是的,我现在明白你的意思了。我认为你在处理两个问题,而我在思考其中一个问题,却无法理解另一个问题。在你的情况下——因为我很懒,而且我喜欢一切都像你知道的那样——如果它能起作用的话,也许你可以为“无任务”添加一条记录,指示-no task bilable=0,hours=0。只需检查一些程序/存储过程是否存在并插入就可以了?
SELECT FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) AS first_day, 
SUM( IFNULL( time_est /60 * payrate, 0 ) ) AS total_earned
FROM calendar
LEFT JOIN tbltask ON tbltask.date_logged = calendar.datefield
LEFT JOIN tbluser ON tbltask.user_id = tbluser .user_id
WHERE datefield <=  '2014-12-26'
GROUP BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) 
ORDER BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) DESC 
LIMIT 8
SELECT FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) AS first_day, 
SUM( IFNULL( time_est /60 * payrate, 0 ) ) AS total_earned
FROM calendar
LEFT JOIN tbltask ON tbltask.date_logged = calendar.datefield
LEFT JOIN tbluser ON tbltask.user_id = tbluser .user_id
WHERE datefield <=  '2014-12-26' AND billable = 1 
GROUP BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) 
ORDER BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) DESC 
LIMIT 8
SELECT FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) AS first_day, 
SUM(IF(billable=1 AND user_id=1, time_est /60 * payrate, 0)) AS total_earned
FROM calendar
LEFT JOIN tbltask ON tbltask.date_logged = calendar.datefield
LEFT JOIN tbluser ON tbltask.user_id = tbluser .user_id
WHERE datefield <=  '2014-12-26' AND billable = 1 
GROUP BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) 
ORDER BY FROM_DAYS(TO_DAYS(datefield) - MOD(TO_DAYS(datefield)-2, 7)) DESC 
LIMIT 8