有人可以帮我这个加入

时间:2018-08-29 16:45:57

标签: sql join

我需要它在33-39周内给我总计0,但我很难加入3张桌子,我无法弄清楚

现在,它只为我提供tracker_weld_table中有实际记录的日期的答案。enter image description here enter image description here enter image description here enter image description here enter image description here

items

2 个答案:

答案 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语法。
  • 写出完整的正确日期常数-YYYY-MM-DD。这是一种ISO标准格式。
  • 我猜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 )

如果您提供表结构和示例数据,则可以为您进一步完善。