2016-04-08 30 views
0

我在英國的分銷中心工作,我最近開始使用SQL查詢直接從數據庫訪問數據。SQL查詢 - 努力寫/結構

我的任務是編寫一個查詢,給出每個通道中的位置總數(來自表locn_hdr)以及每個通道中總的位置數量。我'設法得到我需要的所有信息,但通過使用twp單獨查詢。我掙扎,它們組合成以下標題

過道 - 位置數 - 數的空位置

這兩個查詢我已經低於位置

計數的

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; 

理想情況下,印度只是想要重新編寫的sql的答案。我想了解我將來可以如何做類似的事情。

在此先感謝你們!對不起,如果我沒有提供足夠的信息,輕鬆對我我是新的!

編輯

嗨,首先感謝您的幫助!非常感謝。但是,它不能正常工作,因爲我需要它。列數(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',但是它會爲指示*你正在使用的數據庫的問題添加標籤。 – 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_idon_hand_qtyLEFT OUTER JOIN將在沒有匹配的情況下返回null(而不是排除它們)。

這意味着,如果你有LOCN_HDRlocn_id = 1的記錄,而你也有wm_inventorylocation_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開發人員來訪問數據庫....我不確定它是什麼類型的數據庫,雖然說實話。曼哈頓倉庫管理軟件提供所有這些幫助嗎? –