答案 0 :(得分:1)
我认为您正在尝试这样的事情:
SELECT WEEK(c.dt) as week, COALESCE(SUM(tpa.weight), 0)
FROM calendar_table c left join
tracker_weld_archive tw
on date(tw.weld_dateandtime) = c.dt left join
tracker_parts_archive tp
on tw.tracker_partsID = tp.id and tp.weld_worker = 133
WHERE c.dt >= '2018-07-01' AND c.dt <= '2018-10-01'
GROUP BY week
ORDER BY week;
注意:
LEFT JOIN
。FROM
子句中使用逗号。 始终使用正确的,明确的,标准 JOIN
语法。weld_worker
是一个数字,因此比较不需要单引号。答案 1 :(得分:0)
首先,让我们开始了解您想要的东西。您想要每周的总数。这意味着将有一个“ GROUP BY”子句(也适用于任何MIN(),MAX(),AVG(),SUM(),COUNT()等聚合)。什么是group BY基础。在这种情况下,您每周需要。导致您想要在日历表中限定特定日期范围的下一部分。
我将首先按顺序过滤哪些内容。另外,总是尝试识别查询中的所有表(或别名).column,以便您之后的任何人都知道列的来源,尤其是当有多个表时。在这种情况下,“ ct”是“ Calendar_Table”的别名
SELECT
ct.dt
from
calendar_table ct
where
ct.dt >= '2018-07-01'
AND ct.dt <= '2018-10-01'
现在,上述日期似乎包含10月1日的日期,并且您似乎正试图从9月的7月,8月产生季度金额。我将改为10月1日为LESS。
现在,您的日历有很多天,并且希望按周分组,因此,WEEK()函数可为您提供独特的引用,而无需显式检查每个日期。另外,请尽量不要将保留关键字用作最终的列名...有时会造成混淆。 我已将列名别名为“ WeekBasis”。在这里,我做了一个COUNT(*)只是为了在上下文中显示总天数和组。
SELECT
WEEK( ct.dt ) WeekBasis,
MIN( ct.dt ) as FirstDayOfThisWeek,
MAX( ct.dt ) as LastDayOfThisWeek,
COUNT(*) as DaysInThisWeek
from
calendar_table ct
where
ct.dt >= '2018-07-01'
AND ct.dt <= '2018-10-01'
group by
WEEK( ct.dt )
因此,到目前为止,在您所关注的日期范围内,我们每周有1条记录, 但是我也抓住最早和最新的日期,只是为了展示其他内容。
现在,让我们回到您的额外表中。我们知道有问题的日期,现在需要 从其他表中获取详细信息(该帖子中缺少。您应该发布 关键组件,例如通过公用/联接列基础如何关联表。 tracker_part_archive与tracker_weld_archive有何关系?
为简化查询,您甚至不需要焊接日历表 表格中有一个日期字段,您就知道自己的范围。只需直接查询即可。
如果您的工作人员的ID是数字,则不要在其周围加上引号,而只需留下数字即可。
SELECT
WEEK( twa.Weld_DateAndTime ) WeekBasis,
COUNT(*) WeldingEntriesDone,
SUM(tpa.weight) TotalWeight
from
tracker_weld_archive twa
JOIN tracker_parts_archive tpa
-- GUESSING on therelationship here.
-- may also be on a given date too???
-- all pieces welded by a person on a given date
ON twa.weld_worker = tpa.weld_worker
AND twa.Weld_DateAndTime = tpa.Weld_DateAndTime
where
twa.Weld_Worker = 133
AND twa.Weld_DateAndTime >= '2018-07-01'
AND twa.Weld_DateAndTime <= '2018-10-01'
group by
WEEK( twa.Weld_DateAndTime )
如果您提供表结构和示例数据,则可以为您进一步完善。