Попытка вырезать значения из столбца на основе других столбцов и сохранить это значение для использования в вычислении - PullRequest
1 голос
/ 12 октября 2019

Я немного новичок в t-sql. У меня возникают проблемы с включением значений строк в переменные на основе значений других столбцов.

В таблице базы данных есть одно поле количества, в котором все количества количеств хранятся в виде положительных сумм. Существует отдельный столбец, который представляет направление транзакции. Направление 1 означает, что это входящий. Направление -1 означает, что это входящий. Неттинг входящего кол-ва по отношению к исходящему обеспечивает чистое оставшееся количество.

Мне удалось разделить входящие и исходящие данные в отдельные столбцы. Я присвоил псевдоним каждому столбцу (InQty и OutQty), чтобы дать читателю правильный контекст. Последнее, что мне нужно, - это вычесть две суммы (то есть InQty минус OutQty) в другой столбец с меткой NetQty. Я пытался использовать переменные, с и без оператора case, но ничего, что я пробовал, не работает. Я упал, как будто очень близко, но, похоже, просто не могу получить правильную структуру запроса.

Вывод, который я пытаюсь получить, выглядит следующим образом:

ItemID              ItemPartNumber   InQty       OutQty     NetQty
1140797106360931    ACRFCO           5.000000    2.000000    

Ниже приведен запрос, который я разработал до сих пор.

Строки комментариев помогут мне помочьв разработке запроса.

Select  convert(varchar(max), i.itemid) as ItemID
    ,ItemPartNumber As ItemPartNumber
    ,Sum(case when Direction = 1 Then TransactionQty end) As InQty
    ,Sum(case when Direction = -1 Then TransactionQty end) as OutQty
FROM InventoryTransaction IT
join item i on i.itemid = it.ItemID
group by i.itemid, it.ItemPartNumber
Order by it.ItemPartNumber

Ответы [ 2 ]

1 голос
/ 12 октября 2019

Я думаю, что вы хотите:

select i.itemid, i.ItemPartNumber,
       Sum(case when Direction = 1 Then TransactionQty end) As InQty,
       Sum(case when Direction = -1 Then TransactionQty end) as OutQty,
       sum(case when Direction = 1 then TransactionQty
                when Direction = -1 then TransactionQty
           end) as netqty
from InventoryTransaction IT i
     item i
     on i.itemid = it.ItemID
group by i.itemid, it.ItemPartNumber
order by it.ItemPartNumber;

Я не вижу причин для преобразования первого значения в строку, поэтому я удалил преобразование.

Предполагая, что direction принимает толькозначения -1 и 1 (и, возможно, 0 и NULL), вы можете упростить это до:

select i.itemid, i.ItemPartNumber,
       sum(case when Direction = 1 Then TransactionQty end) As InQty,
       sum(case when Direction = -1 Then TransactionQty end) as OutQty,
       sum(Direction * TransactionQty) as netqty
from InventoryTransaction IT i
     item i
     on i.itemid = it.ItemID
group by i.itemid, it.ItemPartNumber
order by it.ItemPartNumber
0 голосов
/ 13 октября 2019

Я думаю, что хорошим способом избежать дальнейших сравнений, сумм или других операций и повысить производительность может быть использование вашего запроса в качестве подзапроса:

SELECT ItemID, ItemPartNumber, InQty, OutQty, InQty-OutQty AS NetQty FROM(
/* Start of your query */
    Select  convert(varchar(max), i.itemid) as ItemID
        ,ItemPartNumber As ItemPartNumber
        ,Sum(case when Direction = 1 Then TransactionQty end) As InQty
        ,Sum(case when Direction = -1 Then TransactionQty end) as OutQty
    FROM InventoryTransaction IT
    join item i on i.itemid = it.ItemID
    group by i.itemid, it.ItemPartNumber
    Order by it.ItemPartNumber
/* End of your query */
) AS T;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...