我希望用户在他的工作站上处理每个批次的总时间,完成的总估计工作量,用户支付的金额以及用户今年每天的失败次数。如果我可以将所有这些加入到一个查询中,那么我可以在excel中使用它并在数据透视表等中很好地格式化。
编辑:我意识到只有在多个查询中才能这样做,所以我将范围缩小到这个范围:
SELECT batch_log.userid,
batches.operation_id,
SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)),
SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring),
DATE(start_time)
FROM batch_log
JOIN batches ON batch_log.batch_id=batches.id
JOIN ramses.tasks ON ramses.batch_log.batch_id=ramses.tasks.batch_id
JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid
WHERE DATE(ramses.batch_log.start_time) > "2011-01-01"
AND protocase.tblusers.active = 1
GROUP BY userid, batches.operation_id, start_time
ORDER BY start_time, userid ASC
交叉连接导致了问题。
答案 0 :(得分:1)
不,通常情况下,Having
子句用于过滤Group by
的结果 - 例如,仅报告一天内付款超过24小时的人({{1} })。除非您需要对聚合结果进行过滤,否则根本不需要HAVING SUM(ramses.timesheet_detail.paidTime) > 24
条款
这些条件中的大多数应该移动到having
子句中,或者作为连接的一部分,有两个原因 - 1)过滤通常应该尽快完成,以限制查询需要执行的工作。 2)如果过滤已经完成,重新进行过滤可能会导致查询执行额外的,不需要的工作
从我到目前为止看到的情况来看,您似乎正在尝试在当天进行推广 - 尝试将where
子句中的最后一列更改为group by
,或者您正在进行分组(我假设是)一个时间戳。
<小时/> 编辑:
date(ramses.batch_log.start_time)
和from
部分中为它们命名。通常,查询也可以根据某些默认搜索列表解析所需的模式(如何设置或取决于您的数据库)。
join
特别值得关注的是SELECT tblusers.userid, operations.name AS name,
SUM(TIME_TO_SEC(batch_log.time_elapsed)) AS time_elapsed,
SUM(tasks.estimated_nonrecurring + tasks.estimated_recurring) AS total_estimated,
SUM(timesheet_detail.paidTime) as hours_paid,
DATE(start_time) as date_paid
FROM tblusers
JOIN batch_log
ON tblusers.userid = batch_log.userid
AND DATE(batch_log.start_time) >= "2011-01-01"
JOIN batches
ON batch_log.batch_id = batches.id
JOIN operations
ON operations.id = batches.operation_id
JOIN tasks
ON batches.id = tasks.batch_id
JOIN timesheet_detail
ON tblusers.userid = timesheet_detail.userid
AND batch_log.start_time = timesheet_detail.for_day
AND DATE(timesheet_detail.for_day) = DATE(start_time)
WHERE tblusers.departmentid = 8
GROUP BY tblusers.userid, name, DATE(batch_log.start_time)
ORDER BY date_paid ASC
行,它比较(隐含的)时间戳。这些真的是平等吗?我希望其中一个或两个都应该包含在batch_log.start_time = timesheet_detail.for_day
函数中。
至于为什么您可能会收到意外数据 - 您似乎已经消除了一些加入条件。在不知道数据库的确切设置和使用的情况下,我无法给出结果的确切原因(或者甚至可以说它们是错误的),但我认为您加入date()
表而没有任何{{ {1}}条件可能是罪魁祸首 - 如果该表中有2条记录,它会使您之前的所有结果加倍,看起来可能有12条。您还从{{1}中删除了operations
}。子句,可能会也可能不会给你想要的结果。我会查看其余的表关系,看看是否还需要进一步的限制。