0

我希望了解用户在他的工作站上处理每批的总时间、估计完成的总工作量、支付给用户的金额以及用户今年每天的失败次数。如果我可以将所有这些加入到一个查询中,那么我可以在 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

交叉连接导致了问题。

4

1 回答 1

1

不,一般来说,一个Having子句用于过滤您的结果Group by——例如,只报告那些在一天内支付超过 24 小时的人 ( HAVING SUM(ramses.timesheet_detail.paidTime) > 24)。除非您需要对聚合结果进行过滤,否则根本不需要having子句。
出于两个原因,这些条件中的大多数应该被移到where子句中,或者作为连接的一部分 - 1) 通常应该尽快完成过滤,以限制查询需要执行的工作。2) 如果过滤已经完成,重述它可能会导致查询执行额外的、不需要的工作。
从我到目前为止所看到的情况来看,您似乎正试图按天汇总 - 尝试将group by子句中的最后一列更改为date(ramses.batch_log.start_time),或者您正在按(我假设是)时间戳进行分组。


编辑:
关于模式名称 - 是的,您可以在fromjoin部分中命名它们。通常,查询也可能能够根据一些默认搜索列表解析所需的模式(如何设置或是否设置取决于您的数据库)。
以下是我将如何重新格式化查询:

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()函数中。

至于为什么您可能会收到意外数据 - 您似乎已经消除了一些加入条件。在不知道您的数据库的确切设置和使用的情况下,我无法给出您的结果的确切原因(甚至无法说它们是错误的),但我认为您在operations没有任何join条件的情况下加入表的事实可能是罪魁祸首 -如果该表中有 2 条记录,它将使您之前的所有结果翻倍,看起来可能有 12 条。您还operations.namegroup by子句中删除了,这可能会或可能不会给您想要的结果。我会调查您的其他表格关系,看看是否需要进一步限制。

于 2011-06-29T17:09:30.273 回答