2016-05-30 12 views
1

私は英国の有名な小売店の倉庫で働いています。私は、指定された範囲と同じ範囲内の空の場所の総数との間のピック位置の合計数を私に与えるSQL文を書く必要があります。2つの異なるSQL文を1つにまとめる

私はそれぞれに対してクエリを書くことができましたが、同じクエリでそれらを書き込む方法はわかりません。

最初の場所の合計数です。

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

おそらく、あなたの2番目のクエリに簡単な変化が必要な答えを与えますか?

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; 
関連する問題