首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >只有在表中没有其他相关项时才获取sum

只有在表中没有其他相关项时才获取sum
EN

Stack Overflow用户
提问于 2014-06-19 14:43:42
回答 3查看 106关注 0票数 1

我在Server 2005中有以下查询返回的结果。现在,我想加入一个商业规则。如果部件号有一个与之相关的工厂,并且它不是我目前没有检查的工厂,那么它应该被列为零。

在下面的结果中,对于xample,工厂部分编号组合96-ABC应该将和返回为零。但是11-DEF的组合应该继续显示为50.所有其他值都应该返回与现在相同的结果。

如何修改此查询?虽然我试了几个小时,但仍未找到解决办法。

解释性:对于下面突出显示的行,部分编号是ABC。但该部分与工厂"96“没有任何关系,因为您可以在MHL和MMHP表…中看到数据。(这类似于DEF场景)…。但零件号与其他plants (20和21)有关联,因此部件有restricted association,它应该显示为0,用于工厂"96"…。。而对于DEF部分,它是包含所有工厂的OPEN association -因此所有行项的总和应该是SumQty (即,现在显示的50 )。

注意:我们可以在一个查询中得到它吗?分割成两个查询并进行更新对我来说是行不通的。

电流结果

数据

代码语言:javascript
复制
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')

选择查询

代码语言:javascript
复制
select 
  mpp.PlantCode PlantCode, 
  mpp.PartNumber PartNumber,
  sum(MHL.Qty) as SumQty
from @MasterPLantParts mpp
left outer join @MHP MHP 
    on mpp.PlantCode = MHP.PlantCode
inner join @MHL 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
EN

回答 3

Stack Overflow用户

发布于 2014-06-19 16:26:15

我想这可能是你想要的,你需要分步骤.

代码语言:javascript
复制
select mpp.PlantCode PlantCode, mpp.PartNumber PartNumber, sum(IsNull(mhl.Qty,0)) as Qty
into #tt
from @MasterPLantParts mpp
left join @MHP MHP on mpp.PlantCode = MHP.PlantCode
left join @MHL mhl on (mhl.PartNumber = mpp.PartNumber and mhl.LineNumber = mhp.LineNumber)
group by mpp.PlantCode, mpp.PartNumber
order by mpp.PlantCode, mpp.PartNumber


update tt
set Qty = mhl.Qty
FROM #tt tt
inner join @MHL mhl on (mhl.PartNumber = tt.PartNumber)
where tt.Qty=0
  and not exists (select 1 from @MasterPLantParts mpp where mpp.PlantCode<>tt.PlantCode and mpp.PartNumber=tt.PartNumber)

select * from #tt
drop table #tt

这会产生..。

代码语言:javascript
复制
PlantCode PartNumber SumQty
20        ABC         10
21        ABC         100
96        ABC         0
11        DEF         50
80        KXY         55

作为一个select语句,可以这样做.

代码语言:javascript
复制
select mpp.PlantCode PlantCode, mpp.PartNumber PartNumber, Sum(case mhl2.RecCount
                                                                when 1 then mhl2.Qty
                                                                ELSE IsNull(mhl.Qty,0) END) as Qty
from @MasterPLantParts mpp
left join @MHP MHP on mpp.PlantCode = MHP.PlantCode
left join @MHL mhl on (mhl.PartNumber = mpp.PartNumber and mhl.LineNumber = mhp.LineNumber)
left join (select PartNumber, count(1) RecCount, Sum(Qty) as Qty
            from @MHL
            group by PartNumber
            having count(1)=1) mhl2 on (mhl2.PartNumber = mpp.PartNumber)
group by mpp.PlantCode, mpp.PartNumber
票数 1
EN

Stack Overflow用户

发布于 2014-06-20 07:16:55

下面是一个查询。我改变了这方面的逻辑。

首先,我从MHP和MHL表中收集数据,计数数据的总和。

然后加入他们。

代码语言:javascript
复制
;WITH twoInOne AS (

    SELECT MHP.PlantCode, MHL.PartNumber, SUM(MHL.Qty) AS Qty
    FROM @MHL AS MHL
    LEFT JOIN @MHP AS MHP
        ON MHL.LineNumber = MHP.LineNumber 
    GROUP BY MHP.PlantCode, MHL.PartNumber

)
SELECT 
  mpp.PlantCode PlantCode, 
  mpp.PartNumber PartNumber,
  CASE 
    WHEN tIO.PlantCode IS NOT NULL THEN tIO.Qty
    WHEN tIO2.PlantCode IS NULL AND tIO2.PartNumber IS NOT NULL THEN tIO2.Qty
    ELSE 0
 END
FROM @MasterPLantParts mpp
LEFT JOIN twoInOne AS tIO
    ON mpp.PlantCode = tIO.PlantCode
    AND tIO.PlantCode IS NOT NULL
LEFT JOIN twoInOne AS tIO2
    ON mpp.PartNumber = tIO2.PartNumber
    AND tIO2.PlantCode IS NULL  
order by mpp.PlantCode, mpp.PartNumber

我不认识甲骨文,但我想可能是这样的:

代码语言:javascript
复制
SELECT 
  mpp.PlantCode PlantCode, 
  mpp.PartNumber PartNumber,
  CASE 
    WHEN tIO.PlantCode IS NOT NULL THEN tIO.Qty
    WHEN tIO2.PlantCode IS NULL AND tIO2.PartNumber IS NOT NULL THEN tIO2.Qty
    ELSE 0
 END
FROM @MasterPLantParts mpp, 
    (SELECT MHP.PlantCode, MHL.PartNumber, SUM(MHL.Qty) AS Qty
    FROM @MHL MHL, @MHP MHP
    WHERE MHL.LineNumber = MHP.LineNumber(+)
    GROUP BY MHP.PlantCode, MHL.PartNumber
    ) tIO,
    (SELECT MHP.PlantCode, MHL.PartNumber, SUM(MHL.Qty) AS Qty
    FROM @MHL MHL, @MHP MHP
    WHERE MHL.LineNumber = MHP.LineNumber(+)
    GROUP BY MHP.PlantCode, MHL.PartNumber
    ) tIO2
WHERE mpp.PlantCode = tIO.PlantCode(+)
    AND mpp.PartNumber = tIO2.PartNumber(+)
    AND tIO.PlantCode IS NOT NULL
    AND tIO2.PlantCode IS NULL  
order by mpp.PlantCode, mpp.PartNumber
票数 1
EN

Stack Overflow用户

发布于 2014-06-19 16:49:25

警告:未经测试,也可能没有效率- sqlfiddle不起作用。

代码语言:javascript
复制
select mpp.PlantCode PlantCode, 
    mpp.PartNumber PartNumber,
    nvl(sum(MHL.Qty),0) as SumQty -- edit1: add nvl
from @MasterPLantParts mpp
left outer join @MHP MHP on mpp.PlantCode = MHP.PlantCode
left join @MHL MHL on (  -- edit2: from inner join to left join
        MHL.LineNumber = MHP.LineNumber 
    or (
        mpp.PartNumber = MHL.PartNumber
        and mpp.PartNumber not in ( 
            select MHL2.PartNumber 
            from @MHL MHL2 
            inner join @MHP mhp2 on MHL2.LineNumber = MHP2.LineNumber 
            where mhp2.PlantCode != mpp.PlantCode 
        )
    )
)
group by mpp.PlantCode, mpp.PartNumber
order by mpp.PlantCode, mpp.PartNumber
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24309409

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档