2016-05-30 119 views
1

我在英國的一家流行零售商的倉庫工作。我需要編寫一個SQL語句,它給出了給定範圍與同一範圍之間的空位置總數之間的拾取位置總數。將兩個不同的sql語句合併爲一個

我已經設法爲每個查詢編寫查詢,但我不知道如何在同一個查詢中編寫它們。

第一個是位置的總數。

SELECT lh.aisle, count(lh.aisle) 
FROM locn_hdr lh 
WHERE lh.LOCN_CLASS = 'A' 
AND  lh.BAY BETWEEN '0030' AND '0230' 
AND  lh.PICK_DETRM_ZONE LIKE 'HG%' 
AND  lh.AISLE <= 'QA' 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 

這給出了以下結果。

Aisle Count of Locations 
I1  164 
IA  164 
IB  164 
IC  164 
ID  164 

等....有那麼我只所示的第一5.

第二SQL很長的過道的名單

SELECT lh.AISLE, COUNT(lh.AISLE) 
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 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 

這樣做的結果是:

Aisle Count of Empties 
I1  17 
IA  54 
IB  53 
IC  46 
ID  38 

我想表是:

Aisle Count Of locations Count of Empties 
I1  164     17 
IA  164     54 

我希望有一個簡單的方法來做到這一點。

回答

0

一種方法將是SELECT子句中使用EXISTS使用子查詢:

SELECT lh.aisle, count(lh.aisle) as cnt1, 
     SUM(CASE WHEN EXISTS (SELECT 1 
          FROM wm_inventory wi 
          WHERE wi.location_id = lh.locn_id AND wi.on_hand_qty > 0 
       THEN 1 ELSE 0 
      END) as cnt2 
FROM locn_hdr lh 
WHERE lh.LOCN_CLASS = 'A' AND 
     lh.BAY BETWEEN '0030' AND '0230' AND 
     lh.PICK_DETRM_ZONE LIKE 'HG%' AND 
     lh.AISLE <= 'QA' 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 

注:我猜測on_hand_qty是一個數字;因此,我從'0'中刪除了單引號。數字應與數字進行比較;字符串到字符串。

+0

關於''0'的好處 – APC

+0

完美的作品謝謝! –

1

您可以繼續使用您的查詢,您離實際解決方案不遠。只需使用CASE EXPRESSION添加條件彙總:

SELECT lh.AISLE, 
     COUNT(lh.AISLE) as cnt1, 
     COUNT(CASE WHEN wi.location_id IS NULL THEN 1 END) as cnt2 
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' 
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 
0

也許在你的第二個查詢一個簡單的變化給你所需要的答案嗎?

SELECT lh.AISLE 
     , COUNT(lh.AISLE) total_aisles 
     , sum(case when wi.location_id IS NULL then 1 else 0 end) empty_aisles 
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'  
GROUP BY lh.AISLE 
ORDER BY lh.AISLE; 
相關問題