Соединение двух таблиц в столбцах, которые не равны - PullRequest
0 голосов
/ 03 ноября 2019

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

Select a.EquipNbr,
       ISNULL(Sum(a.Downtime),0)
From MobileDowntime (nolock) a
Join MblEquip (nolock) b on a.EquipNbr = b.EquipNbr
Where b.DelFlg = 0 and
      b.EquipNbr <> 'Clean Shop' and
      a.DateTm Between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and  DATEADD(month, DATEDIFF(month, -1, getDate()), -1) 
Group By a.EquipNbr
Order by a.EquipNbr Asc 

пример того, что я пытаюсь выполнить. Но таблица времени простоя собирает данные об изменениях, поэтому не может быть никаких простоев дляэто оборудование на весь месяц. 66 всего единиц оборудования Оборудование / Время простоя 1717 57
1723 0 1724 0 1725 50 1728 0 1734 35 1738 0

Ответы [ 3 ]

1 голос
/ 03 ноября 2019

Вы хотите left join и переместить условия в таблице MobileDowntime в предложение on:

Select e.EquipNbr, coalesce(sum(md.Downtime), 0)
From MblEquip e left join
     MobileDowntime md
     on md.EquipNbr = e.EquipNbr and
        md.DateTm between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) and DATEADD(month, DATEDIFF(month, -1, getDate()), -1)
where e.DelFlg = 0 and e.EquipNbr <> 'Clean Shop'  
group by e.EquipNbr 
order by e.EquipNbr Asc;

Обратите внимание, что я заменил псевдонимы таблицы (надеюсь, правильно). a и b не имеют смысла. Вместо этого я использовал сокращения для имен таблиц.

1 голос
/ 03 ноября 2019

Окончательный ответ

Select b.EquipNbr, Sum(ISNULL((a.Downtime),0)) From MobileDowntime (nolock) a
RIGHT OUTER Join MblEquip (nolock) b on a.EquipNbr = b.EquipNbr
Where b.DelFlg = 0 and b.EquipNbr != 'Clean Shop' 
AND
(
a.datetm is null or 
(a.DateTm Between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) 
and DATEADD(month, DATEDIFF(month, -1, getDate()), -1) )
)
Group By b.EquipNbr Order by b.EquipNbr Asc

Скрипка: https://dbfiddle.uk/?rdbms=sqlserver_2012&fiddle=cc2c2cce139cda7d7c5878d6c967da34

Шаг за шагом

Шаг 1:

Чтовам нужно использовать внешнее соединение и функцию, которая заменяет NULL на ноль (что вы делаете).

Таким образом, в качестве первого шага вы должны сделать следующее:

Select b.EquipNbr, ISNULL((a.Downtime),0) From MobileDowntime (nolock) a
RIGHT OUTER Join MblEquip (nolock) b on a.EquipNbr = b.EquipNbr

Шаг 2: С группировкой по

После этого вы можете добавитьсгруппируйте, чтобы получить следующее:

Select b.EquipNbr, Sum(ISNULL((a.Downtime),0)) From MobileDowntime (nolock) a
RIGHT OUTER Join MblEquip (nolock) b on a.EquipNbr = b.EquipNbr
Where b.DelFlg = 0 and b.EquipNbr != 'Clean Shop' 
Group By b.EquipNbr Order by b.EquipNbr Asc

Последняя часть - это условие where с использованием дат.

Обновление

Ошибка преобразования, по-моему, из-за численного сравнения !=. Я провел эксперимент и преобразовал Varchar в Int.

Затем я изменил != на not like.

Select b.EquipNbr, Sum(ISNULL((a.Downtime),0)) From MobileDowntime (nolock) a
RIGHT OUTER Join MblEquip (nolock) b on a.EquipNbr = b.EquipNbr
Where b.DelFlg = 0 and b.EquipNbr not like 'Clean Shop' 
AND
(
a.datetm is null or 
(a.DateTm Between DATEADD(month, DATEDIFF(month, 0, getDate()), 0) 
and DATEADD(month, DATEDIFF(month, -1, getDate()), -1) )
)

Group By b.EquipNbr Order by b.EquipNbr Asc
0 голосов
/ 03 ноября 2019

Вы можете использовать левое внешнее объединение, в котором оно будет показывать ноль, если нет времени простоя часов

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