Может ли кто-нибудь помочь мне с этим присоединиться - PullRequest
0 голосов
/ 29 августа 2018

Мне нужно, чтобы дать мне 0 на неделю 33 - 39, но я очень плох в соединении с 3 столами, и я не могу понять

В настоящий момент он дает мне ответ только на те даты, когда в tracker_weld_table есть фактические записи. enter image description hereenter image description hereenter image description hereenter image description hereenter image description here

SELECT SUM(tracker_parts_archive.weight), 
WEEK(mycal.dt) as week 
FROM 
tracker_parts_archive, tracker_weld_archive 
RIGHT JOIN 
(SELECT dt FROM calendar_table WHERE dt >= '2018-7-1' AND dt <= '2018-10-1') as mycal 
ON 
weld_worker = '133'AND date(weld_dateandtime) = mycal.dt 
WHERE 
tracker_weld_archive.tracker_partsID = tracker_parts_archive.id 
GROUP BY week

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Во-первых, давайте начнем с понимания того, что вы хотите .. Вы хотите итогов в неделю. Это означает, что будет предложение «GROUP BY» (также для любых агрегатов MIN (), MAX (), AVG (), SUM (), COUNT () и т. Д.). Что является основой группы BY. В этом сценарии вы хотите в неделю. Приводит к следующей части, которую вы хотите для определенного диапазона дат, соответствующего вашей таблице календаря.

Я бы начал с того, КАКИЕ критерии фильтрации в первую очередь. Кроме того, ВСЕГДА ПЫТАЙТЕСЬ идентифицировать все таблицы (или псевдонимы) .column в ваших запросах, чтобы любой после вас знал, откуда поступают столбцы, особенно когда используется несколько таблиц. В этом случае "ct" является алиасом для "Calendar_Table"

SELECT
      ct.dt
   from
      calendar_table ct
   where
          ct.dt >= '2018-07-01' 
      AND ct.dt <= '2018-10-01'

Теперь вышеприведенная дата выглядит ВКЛЮЧЕННОЙ к 1 октября, и похоже, что вы пытаетесь сгенерировать квартальную сумму с июля, августа, сентября. Я бы изменил на МЕНЬШЕ, чем 1 октября.

Теперь у вашего календаря много дней, и вы хотите, чтобы он был сгруппирован по неделям, поэтому функция 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 ??

Чтобы упростить ваш запрос, вам даже не нужна таблица календаря в качестве сварки таблица имеет поле даты, и вы знаете свой диапазон. Просто запросите против этого напрямую.

ЕСЛИ идентификатор вашего работника числовой, не добавляйте кавычки вокруг него, просто оставьте число.

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 )

ЕСЛИ вы предоставляете структуры таблиц И примеры данных, это может быть уточнено для вас немного.

0 голосов
/ 29 августа 2018

Я думаю, вы пытаетесь что-то вроде этого:

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 синтаксис.
  • Запишите полную правильную константу даты - ГГГГ-ММ-ДД. Это стандартный формат ISO.
  • Я предполагаю, что weld_worker - это число, поэтому для сравнения одинарные кавычки не нужны.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...