Sql Server: определите, какую строку учитывать - PullRequest
0 голосов
/ 07 ноября 2019

Мне нужна помощь в решении простой проблемы, которую я считаю, потому что я полностью отстой в SQL. Итак, все в моем запросе работает нормально, но мне нужно настроить его для автоматизации одного процесса. У меня есть товар на разных складах ( AA.Armazem ), и моя цель - выбрать запас ( AA.StkActual ) только одного из этих складов, в зависимости от значения StockValueкаждый. Итак, я всегда хочу рассмотреть AA.Armazem = 'A7' сначала , , затем 'A8 ', , затем 'A9' . Я буду рассматривать склад «A8» только в том случае, если склад «A7» имеет запас = 0 , и поэтому будет рассматривать склад «A9» только тогда, когда «A7» и «A8» отсутствуют на складе (AA.StkActual = 0) .

Сейчас моя проблема в том, что, поскольку я хочу минимальное значение StockValue, я получаю AA.StkActual от AA.Armazem = 'A9', когда мне нужно получитьAA.StkActual AA.Armazem = 'A7', так как он все еще имеет единицы измерения. 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.StkActual от AA.Armazem = 'A7', затем 'A8', затем 'A9', как я объяснил, но только для компонента, который AA.Familia = 98. учитывает только другое хранилище, если в предыдущем хранилище есть Stock = 0.

Если я выполню запрос с условным условием MIN, я получу StkValue, равное 8, что не так,, Мне нужно учитывать StkValue 154, поскольку он находится на складе A7 . Поэтому, если вы посмотрите на запрос, который я предоставил, я хочу получить следующий результат: Запрос на получение минимального значения StkValue -> Значение 25 (50/2) исходит от компонента (DIMM DDR3) снаименьший запас (это информация, которую мне нужно знать, сколько продуктов я могу собрать максимально), вместо того, чтобы получить этот Stock = 8, поскольку в этом случае мне действительно нужно учитывать склад со склада 'A7' для компонента с AA.Familia =98

Надеюсь, вы меня понимаете, я приложил все усилия, чтобы показать вам проблему и то, что я хочу / нужно сделать.

1-е редактирование: Это подзапрос!

2-е редактирование: Я изменил запрос на тот, который я использую, вместо того, чтобы показать вам запрос, предназначенный для продуктов AA.Familia = 98.

3-е редактирование: лучше объясненная проблема

4-е редактирование: изображение ниже и обновленный выше запрос соответствует тому, который я использую / пытаюсь обойти, чтобы получить решение.

StockValue I need to get Как видите, я обвел StockValues, мне нужноet для 3 различных продуктов (25;6;12). Тем не менее, значения, которые я получаю с ответом Джереми, 25;6;15.

Каждый компонент (SBC, CPU, RAM, HDD, DVDRW) имеет свой запас. Запас = 6 для второго продукта, потому что у нас уже есть два из этих компьютеров, поэтому с запросом, который мы пытаемся получить, Stock = 4 в основном.

Как я могу это сделать?

С наилучшими пожеланиями

1 Ответ

0 голосов
/ 07 ноября 2019

Хочу заметить, что вам действительно следует изменить здесь псевдонимы для Artigo - с такими именами A1 и A2, когда у вас также есть значения данных в AA.Armazem с именами A7, A8 и A9, что заставляет задуматьсяиз-за этого весьма запутанно.

С учетом этого вы, скорее всего, захотите развернуть значения A7, A8 и A9, прежде чем начинать их сравнивать. Вы можете использовать синтаксис pivot , если хотите, но я не думаю, что это действительно оправдано здесь. Вместо этого

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...