Коммутатор SQL Server На основе группировки предыдущих значений - PullRequest
2 голосов
/ 10 октября 2019

У меня есть таблица информации о заказе в следующем формате:

╔══════════════╦══════╦════════════════╦═══════════╦═════════╦══════════╗
║ Order Number ║ Line ║      Item      ║ Warehouse ║ Carrier ║ Quantity ║
╠══════════════╬══════╬════════════════╬═══════════╬═════════╬══════════╣
║          255 ║    1 ║ STUFFED-ANIMAL ║ WH1       ║ UPS     ║        3 ║
║          256 ║    1 ║ BLOCKS         ║ WH2       ║ FEDEX   ║        1 ║
║          257 ║    1 ║ DOLL           ║ WH1       ║ UPS     ║        1 ║
║          257 ║    2 ║ DRESS          ║ WH1       ║ UPS     ║        3 ║
║          257 ║    3 ║ SHOES          ║ WH2       ║ UPS     ║        1 ║
║          258 ║    1 ║ CHAIR          ║ WH3       ║ FEDEX   ║        1 ║
║          258 ║    2 ║ CHAIR          ║ WH3       ║ UPS     ║        2 ║
╚══════════════╩══════╩════════════════╩═══════════╩═════════╩══════════╝

Я пытаюсь выполнить запрос таким образом, чтобы я разбил ее на группы на основе уникальной комбинации столбцов.

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

╔════════════════╦══════╦════════════════╦═══════════╦═════════╦══════════╗
║ Package-Number ║ Line ║      Item      ║ Warehouse ║ Carrier ║ Quantity ║
╠════════════════╬══════╬════════════════╬═══════════╬═════════╬══════════╣
║ 255            ║    1 ║ STUFFED-ANIMAL ║ WH1       ║ UPS     ║        3 ║
║ 256            ║    1 ║ BLOCKS         ║ WH2       ║ FEDEX   ║        1 ║
║ 257-1          ║    1 ║ DOLL           ║ WH1       ║ UPS     ║        1 ║
║ 257-1          ║    2 ║ DRESS          ║ WH1       ║ UPS     ║        3 ║
║ 257-2          ║    3 ║ SHOES          ║ WH2       ║ UPS     ║        1 ║
║ 258-1          ║    1 ║ CHAIR          ║ WH3       ║ FEDEX   ║        1 ║
║ 258-2          ║    2 ║ CHAIR          ║ WH3       ║ UPS     ║        2 ║
╚════════════════╩══════╩════════════════╩═══════════╩═════════╩══════════╝

Чтобы разбить его, я хотел бы сделать следующее:

Если номер заказа, склад иНосителем являются те же, что и один «раздел». Если есть только один раздел, то мы просто оставляем номер заказа в качестве номера пакета, в противном случае мы разбиваем его на пакеты. Эти пакеты пронумерованы одним и тем же набором значений, являющихся одинаковыми, но теперь имеют номер, обозначающий, какой это пакет.

Я искал использование row_number() over (partition by..., которое я нашел после поиска похожих проблем, но я нене думаю, что это именно то, что я ищу.

Может ли кто-нибудь указать мне правильное направление?

Ответы [ 2 ]

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

Это сложно. Помочь будет count(distinct) в качестве оконной функции. Но есть удобный трюк, использующий суммы dense_rank() с.

Итак, я думаю, что это делает то, что вы хотите:

select (case when seqnum_asc + seqnum_desc - 1 > 1   -- more than 1 distinct value
             then concat(ordernumber, '-', seqnum_asc)
             else concat(ordernumber, '')            -- just to convert the value to a string
        end) as packagenumber,
        t.*
FROM (select t.*,
             dense_rank() over (partition by ordernumber order by warehouse, carrier) as seqnum_asc,
             dense_rank() over (partition by ordernumber order by warehouse desc, carrier desc) as seqnum_desc
      from mytable t
     ) t;

Здесь это дБ<> fiddle.

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

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

Здесь можно использовать Dense_Rank() вместо Row_Number()

Пример

Select [Package-Number] = concat([Order Number]
                                ,left(nullif(count(*) over (partition by [Order Number] ),1),0)
                                 +dense_rank() over (partition by [Order Number],warehouse,carrier  order by Line)*-1 )
       ,Line
       ,Item
       ,Warehouse
       ,Carrier
       ,Quantity 
  From  YourTable

Возвращает

enter image description here

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