【发布时间】:2020-03-07 03:54:52
【问题描述】:
我有一个包含 5 个子查询的查询。我需要它只有 4 个子查询,因为其中两个应该只有一个结果。问题是我不知道如何维护查询结构并获取这些子查询中 2 的 MIN 值。这是我的查询:
Select Artigo, Descricao, sum(Stock) as Stock, Sum(QuantidadeEmEncomendasPendentes) as QuantidadeEmEncomendasPendentes, Sum(Stock) - Sum(QuantidadeEmEncomendasPendentes) As StockTotal
From (
Select A1.Artigo as Artigo, A1.Descricao as Descricao, sum(AA.StkActual) as Stock, 0 as QuantidadeEmEncomendasPendentes, 'Artigo Stock' As Id
From Artigo A1
Inner Join ArtigoArmazem AA On AA.Artigo = A1.Artigo And (AA.Armazem IN ('A1','A5','A7','A8','A9'))
and A1.CDU_DisponivelOnline = 1
Group By A1.Artigo, A1.Descricao
Union
Select A1.Artigo as Artigo, A1.Descricao as Descricao, 0 as Stock, Sum(LD.Quantidade - LDS.QuantTrans) as QuantidadeEmEncomendasPendentes, 'Artigo Encomenda' As Id
From Artigo A1
Inner Join LinhasDoc LD On LD.Artigo = A1.Artigo And Year(LD.Data) >= 2018 And LD.Quantidade Is Not Null And LD.Quantidade > 0
Inner Join LinhasDocStatus LDS On LDS.IdLinhasDoc = LD.Id And LDS.Fechado = 0 And LDS.Quantidade > LDS.QuantTrans
Inner Join CabecDocStatus CDS On CDS.IdCabecDoc = LD.IdCabecDoc And CDS.Fechado = 0 And CDS.Estado = 'P'
Inner Join CabecDoc CD On CD.Id = LD.IdCabecDoc And CD.TipoDoc = 'NET' And CD.Serie = 'SITE'
and A1.CDU_DisponivelOnline = 1
Group By A1.Artigo, A1.Descricao
Union
select
A1.Artigo as Artigo, A1.Descricao as Descricao, FLOOR(MIN(CASE WHEN A2.familia = 39 THEN AA.StkActual / 2 ELSE AA.StkActual END)) as Stock, 0 as QuantidadeEmEncomendasPendentes, 'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (37,38,39,45))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7'))
and A1.CDU_DisponivelOnline = 1
group by
A1.Artigo,
A1.Descricao
Union
select
A1.Artigo as Artigo, A1.Descricao as Descricao, (coalesce(MIN(
CASE
when AA.Armazem = 'A7' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
), MIN(
CASE
when AA.Armazem = 'A8' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
), MIN(
CASE
when AA.Armazem = 'A9' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
))) as Stock, 0 as QuantidadeEmEncomendasPendentes, 'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (98))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7', 'A8', 'A9'))
and A1.CDU_DisponivelOnline = 1
group by
A1.Artigo,
A1.Descricao
Union
Select A1.Artigo as Artigo, A1.Descricao as Descricao, 0 as Stock, Sum(LD.Quantidade - LDS.QuantTrans) as QuantidadeEmEncomendasPendentes, 'Componente Encomenda' As Id
From Artigo A1
Inner Join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
Inner Join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (37,38,39,45,98))
Inner Join LinhasDoc LD On LD.Artigo = A2.Artigo And Year(LD.Data) >= 2018 And LD.Quantidade Is Not Null And LD.Quantidade > 0
Inner Join LinhasDocStatus LDS On LDS.IdLinhasDoc = LD.Id And LDS.Fechado = 0 And LDS.Quantidade > LDS.QuantTrans
Inner Join CabecDocStatus CDS On CDS.IdCabecDoc = LD.IdCabecDoc And CDS.Fechado = 0 And CDS.Estado = 'P' And LDS.IdLinhasDoc Is Not Null
Inner Join CabecDoc CD On CD.Id = LD.IdCabecDoc And CD.TipoDoc = 'NET' And CD.Serie = 'SITE' And CDS.IdCabecDoc Is Not Null
and A1.CDU_DisponivelOnline = 1
Group By A1.Artigo, A1.Descricao
) As Result
Group by Artigo, Descricao
order by Descricao
我需要获取第 3 和第 4 个子查询的最小值,而不是将它们都添加到主查询的 SUM(Stock) 中。我怎样才能做到这一点?我需要维护查询结构.. 我需要这些查询(第 3 次和第 4 次)结果中的 MIN:
select
A1.Artigo as Artigo, A1.Descricao as Descricao, FLOOR(MIN(CASE WHEN A2.familia = 39 THEN AA.StkActual / 2 ELSE AA.StkActual END)) as Stock, 0 as QuantidadeEmEncomendasPendentes, 'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (37,38,39,45))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7'))
and A1.CDU_DisponivelOnline = 1
group by
A1.Artigo,
A1.Descricao
Union
select
A1.Artigo as Artigo, A1.Descricao as Descricao, (coalesce(MIN(
CASE
when AA.Armazem = 'A7' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
), MIN(
CASE
when AA.Armazem = 'A8' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
), MIN(
CASE
when AA.Armazem = 'A9' then
CASE WHEN A2.Familia = 98 THEN AA.StkActual END
else
null
end
))) as Stock, 0 as QuantidadeEmEncomendasPendentes, 'Componente Stock' As Id
from
Artigo A1
join ComponentesArtigos CA On CA.ArtigoComposto = A1.Artigo
join Artigo A2 On A2.Artigo = CA.Componente And (A2.Familia IN (98))
join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7', 'A8', 'A9'))
and A1.CDU_DisponivelOnline = 1
group by
A1.Artigo,
A1.Descricao
【问题讨论】:
-
只需先将它们合并在一起,找到最小值,然后将结果与其他子查询合并。
-
@EzLo 怎么样?几天来我一直在尝试这样做,但这似乎是不可能的。我无法更改查询结构,因为它需要从“不同角度”计算所有股票。我很讨厌 sql
标签: sql sql-server subquery min