复杂的外部加入条件

时间:2014-06-19 01:13:17

标签: sql sql-server

我有以下表格结构。

逻辑:如果一个工厂 - 部件号组合,如果它在@MHL表中有一个条目,则应该使用SumQty。

  1. 我需要列出植物的总和值" 11"和" DEF" partnumber组合,我需要将总和列为50
  2. 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
    

    当前结果

    enter image description here

    预期结果

    enter image description here

    问题

    QtySum" 50"现在不来了。如何在SQL Server 2005中执行此操作?如果该方法可以在Oracle 8i中运行,那将是很好的

    注意:即使@MHP中没有记录,我也需要从@MHL获得总和。但如果@MHP中有值,请从@MHP获取相关值,@ MHL关系

3 个答案:

答案 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;

SQL Fiddle demo

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;

<强>参考

Oracle SQL*Plus Pocket Reference

答案 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中输出这些值时,您将始终具有空值,因为这就是左外连接所要做的。