2016-05-30 137 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; 
相关问题