我有以下表格结构。
逻辑:如果一个工厂 - 部件号组合,如果它在@MHL表中有一个条目,则应该使用SumQty。
CODE
DECLARE @MHL TABLE (LineNumber VarCHAR(5), PartNumber VARCHAR(10), Qty INT)
INSERT INTO @MHL VALUES ('10001','ABC',10)
INSERT INTO @MHL VALUES ('10002','ABC',100)
INSERT INTO @MHL VALUES ('10003','DEF',50)
INSERT INTO @MHL VALUES ('10005','KXY',25)
INSERT INTO @MHL VALUES ('10006','KXY',30)
DECLARE @MHP TABLE (PlantCode VarCHAR(5), LineNumber VARCHAR(5))
INSERT INTO @MHP VALUES ('20','10001')
INSERT INTO @MHP VALUES ('21','10002')
INSERT INTO @MHP VALUES ('80','10005')
INSERT INTO @MHP VALUES ('80','10006')
DECLARE @MasterPLantParts TABLE (PlantCode VarCHAR(5), PartNumber VARCHAR(10))
INSERT INTO @MasterPLantParts VALUES ('20','ABC')
INSERT INTO @MasterPLantParts VALUES ('21','ABC')
INSERT INTO @MasterPLantParts VALUES ('96','ABC')
INSERT INTO @MasterPLantParts VALUES ('11','DEF')
INSERT INTO @MasterPLantParts VALUES ('80','KXY')
SELECT M.PlantCode,M.PartNumber,SumQty
FROM @MasterPLantParts M
LEFT OUTER JOIN
(SELECT PartNumber, PlantCode, SUM(Qty) SumQty
FROM @MHL H
LEFT OUTER JOIN @MHP p
on P.LineNumber = H.LineNumber
GROUP BY PartNumber, PlantCode
)T
ON T.PartNumber = M.PartNumber
AND T.PlantCode = M.PlantCode
当前结果
预期结果
问题
QtySum" 50"现在不来了。如何在SQL Server 2005中执行此操作?如果该方法可以在Oracle 8i中运行,那将是很好的
注意:即使@MHP中没有记录,我也需要从@MHL获得总和。但如果@MHP中有值,请从@MHP获取相关值,@ MHL关系
答案 0 :(得分:1)
修改强>:
以下查询(比我发布的第一个查询更简单)可以获得所需的结果。首先,选择MasterPLantParts中的所有行(使用LEFT OUTER JOIN)。然后,用MHL进行连接。如果给定工厂的MHP中没有条目,则选择MHL的所有生产线。
select
mpp.PlantCode PlantCode,
mpp.PartNumber PartNumber,
sum(MHL.Qty) as SumQty
from MasterPLantParts mpp
left outer join MHP on mpp.PlantCode = MHP.PlantCode
inner join MHL on MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null)
group by mpp.PlantCode, mpp.PartNumber
order by mpp.PlantCode, mpp.PartNumber;
Oracle 8i语法:
select
mpp.PlantCode PlantCode,
mpp.PartNumber PartNumber,
sum(MHL.Qty) as SumQty
from MasterPLantParts mpp, MHP, MHL
where mpp.PlantCode = MHP.PlantCode(+)
and (MHL.LineNumber = MHP.LineNumber or (mpp.PartNumber = MHL.PartNumber and MHP.LineNumber is null))
group by mpp.PlantCode, mpp.PartNumber
order by mpp.PlantCode, mpp.PartNumber;
<强>参考强>:
答案 1 :(得分:0)
我还没有在你的任何dbms上测试它,但是它应该对它们都进行微小的修复。
select PlantCode, PartNumber, sum(qty)
from (
select x.PlantCode, x.PartNumber, y.Qty
from MasterPLantParts x
join MHL y
on x.PartNumber = y.PartNumber
left join MHP z
on x.PlantCode = z.PlantCode
where z.PlantCode is null
union
select x.PlantCode, x.PartNumber, z.Qty
from MasterPLantParts x
join MHP y
on x.PlantCode = y.PlantCode
join mhl z
on y.LineNumber = z.LineNumber
) as T
group by PlantCode, PartNumber;
PLANTCODE PARTNUMBER 3
--------- ---------- -----------
11 DEF 50
20 ABC 10
21 ABC 100
80 KXY 55
96 ABC 110
答案 2 :(得分:0)
INSERT INTO @MHP VALUES ('91','what ever line number you wan to go here')
INSERT INTO @MHP VALUES ('11','what ever line number you wan to go here')
在MHP中输出这些值时,您将始终具有空值,因为这就是左外连接所要做的。