Как добавить конкретное значение из таблицы в новый столбец? - PullRequest
1 голос
/ 07 октября 2019

У меня есть «Таблица заказов». А в «Таблице заказов» есть многоцелевой столбец с именем «Единица».

OrderCode,   ProductCode,   ProductName,   Unit,   ProductId
123,         002,           Box No,        1,      1111
123,         223344,        Abc,           4,      11873993
123,         888444,        Zxc,           1,      66474833
123,         883372,        Ubn,           2,      88575744
123,         002,           Box No,        2,      1111
123,         788665,        Muq,           3,      88887777
123,         900223,        Zue,           1,      22234567
123,         665543,        Erv,           1,      12399998

Столбец «Единица» имеет значение от 1 до N для номеров ящиков для конкретного значения ГдеProductID = 1111. Кроме того, столбец «Единица» имеет значения единиц для других идентификаторов продукта .

Каждый ордер начинается с ProductID = 1111 и первого номера ящика = 1 (отображается в поле Unit)Перечисленные ниже Товары находятся в том же окне, пока следующий ProductID = 1111, затем номер поля = N (отображается в поле Единица измерения)

В поле «Единица» показано количество Продуктов, кроме ProductID = 1111

Iпробовал:

CASE WHEN ProductId = 1111 THEN Unit END AS BoxNo 

Но это не работает.

Я хотел добавить новый столбец с именем "BoxNo", который включает в себя для каждого номера продуктов Box

OrderCode,   <b>BoxNo</b>,    ProductCode,   ProductName,   Unit,   ProductId
123,         <b>Null</b>,     002,           Box No,        1,      1111
123,         <b>1</b>,        223344,        Abc,           4,      11873993
123,         <b>1</b>,        888444,        Zxc,           1,      66474833
123,         <b>1</b>,        883372,        Ubn,           2,      88575744
123,         <b>Null</b>,     002,           Box No,        2,      1111
123,         <b>2</b>,        788665,        Muq,           3,      88887777
123,         <b>2</b>,        900223,        Zue,           1,      22234567
123,         <b>2</b>,        665543,        Erv,           1,      12399998

Ответы [ 2 ]

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

Ваши результаты, кажется, предполагают порядок в таблице. Таблицы SQL представляют неупорядоченные наборы. Вам нужен столбец для указания порядка.

С таким столбцом вы можете сделать это, используя оконные функции и логику для case:

select t.*,
       (case when ProductId <> 1111
             then count(*) filter (where ProductId = 1111) over (order by <ordering col>)
        end) as box_num
from t;

Это число 1111до каждой строки.

РЕДАКТИРОВАТЬ:

В SQL Server вы должны использовать SUM(CASE):

select t.*,
       (case when ProductId <> 1111
             then sum(case when ProductId = 1111 then 1 else 0 end) over (order by <ordering col>)
        end) as box_num
from t;
0 голосов
/ 07 октября 2019

Вы можете сделать это, но вам нужна некоторая функция скрипта, а не просто SQL.

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

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

Ваш SQL CASE работает, ноне дает ожидаемого результата просто потому, что он обусловлен указанием «единицы измерения» в соответствующей строке, например: sets the box number as unit just if product id equals 1111

Просто настроив его таким образом, выбудет иметь, что возвращает ноль только в строках с productid равным 1111:

(CASE productid WHEN 1111 THEN null ELSE 1 END) AS boxno

С результатом: null printed as box no if product id equals 1111

Но ядумаю, это действительно зависит от базы данных, которую вы используете, если есть какая-то разница.

В качестве теста я создал простую таблицу с данными, предоставленными в PostGreSQL, но факт остается тем же, как указано выше ... у вас нет способа сохранитьЛокальная переменная, если вы ее не написали.

Один из способов обойти это, это использовать id текущей строки, чтобы определить, какой результат вы должны рассмотреть, и сложить его с count().

simple select with the result of the script inserted above

Опять же, это было достигнуто в PostGreSQL (pgAdmin 4) с помощью этого запроса:

SELECT ordercode,(CASE 
        WHEN productid = 1111 THEN null ELSE
        (SELECT count(productid) FROM test_stck WHERE productid = 1111 AND id < a.id)
        END) AS,
        productcode,productname,unit,productid
FROM test_stck AS a

Но у вас должен быть идентификатор строки, к которой вы можете получить доступ, иначе вы не сможете это сделать. Кроме того, я не использовал его, но вы должны заказывать свой список идентификаторов, как вы извлекаете его. В противном случае вы могли бы иметь другую сортировку, которая привела бы к нежелательным результатам.

Другой подзапрос, который мог бы добиться цели, таков:

SELECT ordercode,(CASE 
        WHEN productid = 1111 THEN null ELSE
        (SELECT unit FROM test_stck WHERE productid = 1111 AND id < a.id ORDER BY unit DESC LIMIT 1)
        END) AS boxno,
        productcode,productname,unit,productid
FROM test_stck AS a

Порядок по единицам подразумевает, что вы сортируете его доизвлекая его. И предел 1 гарантирует, что вы выбираете только последний элемент подзапроса, также id < a.id является своего рода страховкой.

Просто для визуализации полного набора подзапроса (без ограничения 1), это будети заказал так: enter image description here

Надеюсь, я не усложнил))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...