Как суммировать с помощью объединения

#sql #sql-server

#sql #sql-сервер

Вопрос:

Как суммировать при использовании объединения

Я пытаюсь выполнить приведенный ниже запрос. Когда я запускаю его, он не показывает результатов. Я пытаюсь перечислить имена каждого пользователя и их часы работы за текущий месяц.

 Select a.UserNm, sum(isnull(b.hrs, 0))Hours
from Appuser a
    JOIN EquipWorkOrderHrs b 
        on a.UserID = b.UserID
Where a.DelFlg = 0 and DateTm between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
Group by a.UserNm
Order by a.UserNm

  

Если я выполняю только запрос по часам, я получаю 715,25

 SELECT sum (Hrs) FROM EquipWorkOrderHrs
  

После того, как я посмотрел на это подробнее, я должен был добавить третью таблицу, я искал неправильные таблицы DateTm. То, что у меня есть ниже, показывает три таблицы, которые мне нужны для выполнения этой работы. Когда я запускаю это, я получаю сообщение об ошибке, в котором говорится, что многосоставный идентификатор «c.EquipWorkOrderID» не может быть привязан.

 Select a.UserNm, sum(isnull(c.hrs, 0))Hours
from Appuser a
    JOIN EquipWorkOrder b 
        on b.EquipWorkOrderID = c.EquipWorkOrderID
    JOIN EquipWorkOrderHrs c 
            on a.UserID = c.UserID
Where a.DelFlg = 0 and b.DateTm between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
Group by a.UserNm
Order by a.UserNm

  

Комментарии:

1. ваши DateTm between условия, похоже, расположены в неправильном порядке. Это должно быть between DATEADD(month, DATEDIFF(month, -1, getDate()), -1) and DATEADD(month, DATEDIFF(month, 0, getDate()), 0)

2. Я попробовал, как вы предложили, все те же результаты

3. Каким должно быть условие даты? В этом месяце? В прошлом месяце?

4. Условие даты для этого месяца

5. Не могли бы вы предоставить примерные данные?

Ответ №1:

Я бы отлаживал запросы поэтапно, чтобы увидеть, где запрос прерывается.

Первый шаг уже был выполнен вами:

Шаг 1

 SELECT sum (Hrs) FROM EquipWorkOrderHrs
  

Шаг 2 — Объединение

 SELECT sum (b.Hrs)
from Appuser a
    JOIN EquipWorkOrderHrs b 
        on a.UserID = b.UserID
  

Шаг 3 — ГДЕ условие #1

 SELECT sum (b.Hrs)
from Appuser a
    JOIN EquipWorkOrderHrs b 
        on a.UserID = b.UserID
Where a.DelFlg = 0 
  

Шаг 4 — ГДЕ условие # 2

 SELECT sum (b.Hrs)
from Appuser a
    JOIN EquipWorkOrderHrs b 
        on a.UserID = b.UserID
Where a.DelFlg = 0 
and DateTm between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
  

Редактировать для нового вопроса
Вы соединяете таблицы в неправильном порядке — вы ссылаетесь c.EquipWorkOrderID на условие соединения таблицы EquipWorkdOrder b перед объединением таблицы EquipWorkOrderHrs c . Попробуйте выполнить следующее:

 Select a.UserNm, sum(isnull(c.hrs, 0))Hours
from Appuser a
    JOIN EquipWorkOrderHrs c 
            on a.UserID = c.UserID
    JOIN EquipWorkOrder b 
        on b.EquipWorkOrderID = c.EquipWorkOrderID
Where a.DelFlg = 0 and b.DateTm between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
Group by a.UserNm
Order by a.UserNm
  

Комментарии:

1. шаги 1, 2 и 3 возвращают число, шаг 4 возвращает null. Я пытаюсь перечислить каждого человека и общее количество часов за текущий месяц, а не общую сумму всех часов. Возможно, я делаю это неправильно.

2. Я обновил свой исходный пост, я искал неправильную таблицу для DateTm

3. См. Редактирование в ответе.

Ответ №2:

Если вам нужен текущий месяц, вы можете использовать:

 Select a.UserNm, sum(coalesce(ewoh.hrs, 0))Hours
from Appuser a join
     EquipWorkOrderHrs ewoh
     on a.UserID = ewoh.UserID
Where a.DelFlg = 0 and
      DateTm >= datefromparts(year(getdate()), month(getdate()), 1)
Group by a.UserNm
Order by a.UserNm;
  

Это предполагает, что нет данных, датированных будущим. Если есть, используйте:

 Where a.DelFlg = 0 and
      DateTm >= datefromparts(year(getdate()), month(getdate()), 1) and
      DateTm < dateadd(month, 1, datefromparts(year(getdate()), month(getdate()), 1))
  

Комментарии:

1. Я попробовал, как вы предложили, все те же результаты

2. @JShaffer . , , Возможно, у вас нет данных за текущий месяц.