首页 > 解决方案 > Sql Server:定义要考虑的行

问题描述

我需要帮助来解决我认为的一个简单问题,因为我真的不擅长 SQL。因此,我的查询中的所有内容都运行良好,但我需要对其进行调整以自动化一个过程。我在不同的仓库(AA.Armazem)中有一个产品,我的目标是选择其中一个仓库的库存(AA.StkActual),具体取决于每个仓库的 StockValue 。所以,我总是想首先考虑AA.Armazem = 'A7'然后是 'A8 ',然后是 'A9'如果仓库 'A7' 的 stock = 0 ,我只会考虑仓库 'A8' ,因此,仅当 'A7' 和 'A8' 缺货 (AA.StkActual = 0) 时才考虑仓库 'A9'

现在我的问题是,因为我想要最小的 StockValue,所以当我应该得到 AA.Armazem = 'A7' 的 AA.StkActual 时,我得到了 AA.Armazem = 'A9' 的 AA.StkActual,因为它还是有单位的。PS有问题的组件来自 AA.Familia = 98。还有其他家族的组件,但就像我说的,它们都在“A7”仓库中。

这是我的查询:

    select
    A1.Artigo as Artigo,
    A1.Descricao as Descricao, (coalesce(MIN(
        case
            when AA.Armazem = 'A7' then 
                CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
            else
                null
        end
    ), MIN(
        case
            when AA.Armazem = 'A8' then 
                CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
            else
                null
        end
    ), MIN(
        case
            when AA.Armazem = 'A9' then 
                CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE 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 (37,38,39,45,98))
    join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7','A8', 'A9'))
group by
    A1.Artigo,
    A1.Descricao

我提出的查询给了我最低库存作为结果,但是,如果我只是得到所有组件,我会得到这个结果:

查询所有组件且没有 MIN 正如您在图像上看到的那样,“SBC”组件是来自 AA.Familia = 98; 的组件。我需要查询首先考虑AA.Armazem = 'A7' 中的 AA.StkActual,然后是 'A8',然后是 'A9',正如我所解释的,但仅适用于 AA.Familia = 98 的组件。它只考虑如果前一个仓库的库存 = 0,则为其他仓库。

如果我使用 MIN 条件运行查询,我将得到 8 的 StkValue ,这没有错,问题是,我需要考虑 154 的 StkValue ,因为它位于 'A7' Warehouse 上。因此,如果您查看我提供的查询,我希望得到以下结果:查询最小 StkValue -> 值 25 (50/2) 来自库存最少的组件 (DIMM DDR3)(即信息我需要知道我最多可以制造多少产品),而不是让 Stock = 8 因为在这种情况下,我真的需要考虑 AA.Familia = 98 的组件来自仓库“A7”的库存

我希望你能理解我,我尽我所能向你展示问题以及我想要/需要做什么。

第一次编辑:这是一个子查询!

第二次编辑:我已将查询更改为我正在使用的查询,而不是向您显示针对 AA.Familia = 98 产品的查询。

第三次编辑:更好地解释问题

第 4 次编辑:下图并将上述查询更新为我正在使用/尝试解决的问题以获取解决方案。

我需要得到的 StockValue 如您所见,我已经圈出了我需要为 3 种不同产品(25;6;12)获取的 StockValues。但是,我从 Jeremy 的回答中得到的值是 25;6;15.

每个组件(SBC、CPU、RAM、HDD、DVDRW)都有自己的库存。第二个产品的 stock = 6 是因为我们已经构建了 2 台这样的计算机,所以对于我们试图获得的查询,Stock = 4 基本上。

我怎样才能做到这一点?

此致

标签: sql-server

解决方案


我想指出,您确实应该在此处更改您的别名Artigo——将其命名为A1,并且A2当您在AA.Armazem命名为 A7、A8 和 A9 中也有数据值时,这会使您对这个问题的思考变得非常混乱。

这样一来,您很可能希望在开始比较之前先调整 A7、A8 和 A9 值。如果需要,您可以使用枢轴语法,但我认为这里没有必要这样做。反而,

    select
        A1.Artigo as Artigo,
        A1.Descricao as Descricao,
        MIN(
            case
                when AA.Armazem = 'A7' then 
                    CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
                else
                    null
            end
        ) AS StockA7,
        MIN(
            case
                when AA.Armazem = 'A8' then 
                    CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
                else
                    null
            end
        ) AS StockA8,
        MIN(
            case
                when AA.Armazem = 'A9' then 
                    CASE WHEN A2.Familia = 39 THEN AA.StkActual / CA.Quantidade ELSE AA.StkActual END
                else
                    null
            end
        ) AS StockA9,
        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,98))
        join ArtigoArmazem AA ON AA.Artigo = A2.Artigo And (AA.Armazem IN ('A7', 'A8', 'A9'))
    group by
        A1.Artigo,
        A1.Descricao

然后,您可以使用此查询的结果来选择 A7 和 A8 值。

    select
        Artigo,
        Descricao,
        coalesce(
            nullif(StockA7, 0),
            nullif(StockA8, 0),
            nullif(StockA9, 0)
        ) Stock

推荐阅读