2016-04-08 2 views
0

Я работаю в распределительном центре в Великобритании, и недавно я начал использовать sql-запросы для доступа к данным непосредственно из db.Sql query - Борьба за запись/структуру

Мне было поручено написать запрос, который дает общее количество мест, которые мы имеем в каждом проходе (из таблицы locn_hdr), и общее количество мест emtpy в каждом из этих проходов. I'vr удалось получить всю информацию, которая мне нужна, но с помощью двух разных запросов. Я изо всех сил, чтобы объединить их в нижеприведенных заголовки

КОРИДОР - количество мест - количество пустых мест

два запроса я находятся ниже

Графа мест

select AISLE, COUNT(AISLE)  
from LOCN_HDR LH  
where LH.LOCN_CLASS = 'A'  
and BAY >= '0030'  
AND BAY <= '0230'  
AND PICK_DETRM_ZONE LIKE 'HG%'  
AND LH.AISLE <= 'QA'  
group by aisle  
Order by aisle; 

Количество пустот

SELECT  aisle, COUNT(dsp_locn)  
FROM locn_hdr lh  
WHERE lh.locn_class = 'A'  
AND bay >= '0030'  
AND bay <= '0230'  
AND pick_detrm_zone LIKE 'HG%'  
AND lh.aisle <= 'QA'  
AND NOT EXISTS  
(SELECT 1  
    FROM wm_inventory wi  
    WHERE wi.location_id = lh.locn_id  
    AND wi.on_hand_qty > '0')  
GROUP BY aisle  
ORDER BY aisle; 

В идеале indont просто хочет получить ответ с sql re написанным. Я хочу понять, как я могу сделать что-то подобное себе в будущем.

Спасибо заранее, ребята! Извините, если я не получил достаточную информацию, иди спокойно на меня, я новичок!

редактировать

Привет, спасибо за помощь в первую очередь! Это ценно. Тем не менее, он не работает так, как он мне нужен. количество столбцов (lh.aisle) подсчитывает количество пустых мест, а не общее количество мест в проходе. У меня было немного изменить SQL, потому что я получаю сообщения об ошибках, поэтому я временно использовал

SELECT lh.AISLE, COUNT(lh.AISLE), COUNT(wi.location_id) -- count(lh.aisle) gives me the total empty locatins. Count(wi.location_id) gives me nothing... 
FROM LOCN_HDR lh 
LEFT OUTER JOIN wm_inventory wi ON wi.location_id = lh.locn_id AND wi.on_hand_qty > '0' 
WHERE lh.LOCN_CLASS = 'A' 
AND  lh.BAY BETWEEN '0030' AND '0230' 
AND  lh.PICK_DETRM_ZONE LIKE 'HG%' 
AND  lh.AISLE <= 'QA' 
AND  wi.location_id IS NULL -- where there is no matching record for lh.locn_id with a quantity > 0 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 

Это дало мне количество пустых мест, которые является фантастическим. Но у меня нет счета общего количества мест (пусто или нет).

Больше идей будет оценено!

+1

Это похоже на «SQL Server», но было бы полезно добавить тег к вопросу, указывающему *, который * DB вы используете. – levelonehuman

+0

@levelonehuman: это на самом деле довольно стандартный SQL –

+0

Несвязанный, но: вы не должны сравнивать строки и числа, такие как 'wi.on_hand_qty> '0'' ''0'' - это строковая константа, а не число. '0' - это номер –

ответ

0
SELECT lh.AISLE, COUNT(lh.AISLE), COUNT(wi.dsp_locn) 
FROM LOCN_HDR lh 
LEFT OUTER JOIN wm_inventory wi ON wi.location_id = lh.locn_id AND wi.on_hand_qty > '0' 
WHERE lh.LOCN_CLASS = 'A' 
AND  lh.BAY BETWEEN '0030' AND '0230' 
AND  lh.PICK_DETRM_ZONE LIKE 'HG%' 
AND  lh.AISLE <= 'QA' 
AND  wi.ID IS NULL -- where there is no matching record for lh.locn_id with a quantity > 0 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 

Нечто похожее на это должно работать, хотя я не могу проверить его без данных. Ваши два запроса в основном одинаковы, за исключением AND NOT EXISTS (... FROM wm_inventory ...).

В принципе, вы можете LEFT OUTER JOIN этот стол на location_id и on_hand_qty. LEFT OUTER JOIN вернет null, где нет совпадения (вместо исключения).

Это означает, что если у вас есть запись в LOCN_HDR с locn_id = 1, и у вас также есть запись в wm_inventory с location_id = 1 но и количество 2, вы получите NULL для этой записи.

В сочетании с WHERE wi.ID IS NULL (изменение соответствует столбцу таблицы wi), это заменяет предложение NOT EXISTS во втором запросе.

Вы может запустить в проблему с выбором COUNT(wi.dsp_locn) благодаря GROUP BY, но вы должны быть в состоянии добавить GROUP BY lh.AISLE, wi.dsp_locn - это объединить все элементы, которые имеют как тот же lh.AISLE AND wi.dsp_locn.

Если вам нужно какое-либо дополнительное объяснение, сообщите мне, я был бы рад дать ему шанс.

+0

Примечание. Этот ответ предполагает, что вы используете 'sql server' - если нет, синтаксис может быть недействительным. – levelonehuman

+0

В вашем ответе нет ничего нестандартного (или SQL Server). –

+0

Привет, я использую разработчик oracle SQL для доступа к БД .... Я не уверен, какой тип базы данных это, если честно. Это Manhattan Warehouse Management Software предоставляет все это, если это помогает? –

Смежные вопросы