2016-04-08 31 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开发人员来访问数据库....我不确定它是什么类型的数据库,虽然说实话。曼哈顿仓库管理软件提供所有这些帮助吗? –