#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 . , , Возможно, у вас нет данных за текущий месяц.