Sql server 使用子选择或子查询进行聚合

Sql server 使用子选择或子查询进行聚合,sql-server,subquery,Sql Server,Subquery,我试图做一个查询,根据不同仓库的组件单元总和的最低值返回我能生产多少 数据来自以下表格: e.table ------- codartp codartc unicompo REF1 BLISTER1 1 REF1 BOX1 1 REF1 CHARGER1 2 REF2 BLISTER2 1 REF2 BOX2 1 s.table ------

我试图做一个查询,根据不同仓库的组件单元总和的最低值返回我能生产多少

数据来自以下表格:

e.table
-------
codartp    codartc      unicompo
REF1       BLISTER1       1
REF1       BOX1           1
REF1       CHARGER1       2
REF2       BLISTER2       1
REF2       BOX2           1

s.table
------
codart      unidades      codalm
BLISTER1      100           4 
BLISTER1      150           1
BOX1          100           1
BOX1          100           4
BOX1          200           2
CHARGER1      50            3
CHARGER1      50            4 
BLISTER2      500           1
BLISTER2      300           4 
BOX2          150           2
我需要总结我从每个组件(泡罩、盒子、充电器……)中总共得到多少: 1:250 框1:400 收费1:100

然后返回最小值除以unicompo(我需要的组件数量)。有了我的零部件库存,我只能生产50台参考1:100/2

这是我的选择:

(select min(val) from (select sum(s1.unidades/e.unicompo) as val 
    from __STOCKALMART s1
    left join escandallo e on e.codartc = s1.codart
    where s1.codalm not in (0,9999) and e.codartp = l.codart) t) as PRODUCIBLE
预期结果如下:

l.codart  producible
REF1          50
REF2          150
但我只设法调用了min(在某些仓库中是0)或组件的总和,而不是总和之后的min。我不知道我是否在解释我自己。问我是否需要澄清什么


感谢您的帮助

只要您的产品组成之间没有重叠(因此没有两个产品共享同一个组件,否则您将看到更复杂的内容),那么下面的查询应该会为您提供解决方案

样本数据

create table ProductComponent
(
  codartp nvarchar(4),  -- product
  codartc nvarchar(10), -- component
  unicompo int          -- amount
);

insert into ProductComponent (codartp, codartc, unicompo) values
('REF1', 'BLISTER1', 1),
('REF1', 'BOX1'    , 1),
('REF1', 'CHARGER1', 2),
('REF2', 'BLISTER2', 1),
('REF2', 'BOX2'    , 1);

create table ComponentInventory
(
  codart nvarchar(10), -- component
  unidades int,        -- amount
  codalm int           -- warehouse
);

insert into ComponentInventory (codart, unidades, codalm) values
('BLISTER1', 100, 4), 
('BLISTER1', 150, 1),
('BOX1'    , 100, 1),
('BOX1'    , 100, 4),
('BOX1'    , 200, 2),
('CHARGER1', 50 , 3),
('CHARGER1', 50 , 4), 
('BLISTER2', 500, 1),
('BLISTER2', 300, 4), 
('BOX2'    , 150, 2);
解决方案

使用一些常用表表达式(CTE)来:

  • 汇总仓库中的所有库存组件
  • 根据产品组成将之前的总和除以
  • 这使得:

    with cti as -- component inventory total
    (
      select ci.codart,
             sum(ci.unidades) as unidades
      from ComponentInventory ci
      group by ci.codart
    ),
    pci as -- product component inventory
    (
      select pc.codartp,
             cti.unidades / pc.unicompo as maxPart
      from ProductComponent pc
      join cti
        on cti.codart = pc.codartc
    )
    select pci.codartp,
           min(pci.maxPart) as producibleAmount
    from pci
    group by pci.codartp
    order by pci.codartp;
    
    结果

    codartp producibleAmount
    ------- ----------------
    REF1    50
    REF2    150
    

    要查看它在中间CTE结果中的运行情况。

    请显示预期结果和完整结果query@Squirrel对不起,我刚刚完成了完整的查询,而不仅仅是子查询。您可能需要
    应用子查询
    ,以便获得多行和columns@Charlieface完整的查询将是
    从linepedi中选择l.codart,(子查询)和大量过滤器
    我认为问题出在子查询上=/有时一个组件由两个产品共享,但我想返回我可以生产多少而不考虑这一点(如果我浪费我的组件生产“a”,将无法生产“B”,但我想知道我可以生产它们)。另一方面,是否有任何方法可以实现这一点,而不必创建这么多表?我有数千个组件和产品,我想使用系统中的表格。非常感谢。哦,好的,对不起,我刚刚看到它和我的基准表一起工作。非常感谢你