sql-获取2个子查询的最小值

问题描述 投票:-1回答:1

我有一个包含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

并且我需要获取第三和第四子查询的最小值,而不是将它们都添加到主查询的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
sql sql-server subquery min
1个回答
0
投票

希望我已正确理解您的问题。

将下面的查询用于第三和第四查询。

SELECT Artigo ,Descricao , Stock , QuantidadeEmEncomendasPendentes , Id
FROM
(
SELECT Artigo ,Descricao , Stock , QuantidadeEmEncomendasPendentes , Id ,    ROW_NUMBER() OVER(ORDER BY Stock ASC) RN
FROM
(
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
sql sql-server subquery min
)
)
WHERE RN = 1

您可以在下面的链接中查看ROW_NUMBER()的更多详细信息

https://docs.microsoft.com/en-us/sql/t-sql/functions/row-number-transact-sql?view=sql-server-ver15

© www.soinside.com 2019 - 2024. All rights reserved.