Вставка в две таблицы на основе определенной группировки в запросе - PullRequest
0 голосов
/ 22 января 2019

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

    SELECT
        OrdNumber,
        Detail1,
        Detail2,
        Detail3, 
        Date,
        Quantity,
        Customer,
        OrderingCode

    FROM Orders o
    INNER JOIN (SELECT os.*,
         row_number() over (partition by Detail1, Detail2,Detail3 ) as seqnum
    FROM orderSheets os
    ) os
      on o.product = os.product and
      o.Detail2 = os.Detail2 and
      o.Detail3 = os.Detail3 

И взять оттуда необходимые данные, основываясь на определенных условиях, и вставить записи, связанные в дватаблицы.

Я хочу вставить данные на основе группировки каждой записи по отдельным деталям Detail1, Detail2 и Detail3 для этого клиента по этому заказу, а затем посмотреть на максимальное количество, если у меня есть несколько записей для одной детали1/ detail2 / detail3 / уникальная группа клиентов

С помощью запроса выше, скажем, я возвращаю эти результаты:

    OrdNumber |  Detail1 |  Detail2 |  Detail3 |     Date    | Quantity | Customer  | OrderingCode
    -----------------------------------------------------------------------------------------
    12345         122         123         12     12/12/2018        2       123         567
    12345         122         123         15     12/12/2018        2       123         567
    12345         516         123         63     12/12/2018        5       123         567
    12345         617         123         14     12/12/2018        7       123         567
    12345         617         123         14     12/12/2018        4       123         567
    12345         617         123         17     12/12/2018        2       123         567
    12345         745         123         43     12/12/2018        2       123         567

Большинство результатов уже различны, но у меня есть две записи, которые разделяютодни и те же детали1, детали2 и детали3 для этого клиента по этому заказу (617, 123, 14), поэтому в этом случае я хочу вставить только одну запись в таблицу продуктов для этих двух результатов (отдельные детали, номер клиента, номер заказа,date и orderingCode) и одна внешняя запись в таблице заказов, но я хочу вставить только наибольшее количествоиз двух записей (поэтому в этом примере я бы вставил номер заказа, внешний ключ, который является идентификатором продукта, и 7 в качестве количества, поскольку он является самым высоким из двух записей, имеющих 7 и 4)

Итак, с указанным выше результатом, я бы хотел вставить вставки продукта в две таблицы следующим образом:

Продукты

    ID   | Detail1 | Detail2 | Detail3 | Customer | OrderingCode |    Date 
    ----------------------------------------------------------------------------   
    1001    122        123       12        123        567          12/12/2018  
    1002    122        123       15        123        567          12/12/2018  
    1003    516        123       63        123        567          12/12/2018  
    1004    617        123       14        123        567          12/12/2018  
    1005    617        123       17        123        567          12/12/2018  
    1006    745        123       43        123        567          12/12/2018  

Заказы

    P_ID  |  Quantity  |      Date    |  orderNumber  
    -------------------------------------------------           
    1001         2        12/12/2018      12345               
    1002         2        12/12/2018      12345               
    1003         5        12/12/2018      12345               
    1004         7        12/12/2018      12345               
    1005         2        12/12/2018      12345               
    1006         2        12/12/2018      12345               

1 Ответ

0 голосов
/ 22 января 2019

Немного сложно, но попробуйте это КАК ЕСТЬ:

create table Products (
  ID int not null generated always as identity primary key
, Detail1 int not null
, Detail2 int not null
, Detail3 int not null
, Customer int not null
, OrderingCode int not null
, Date date not null
) in userspace1;

create table Orders(
  P_ID int not null
, Quantity int not null
, Date date not null
, orderNumber int not null
, constraint orders_fk foreign key (p_id) references Products (id)
) in userspace1;

with r (OrdNumber, Detail1, Detail2, Detail3, Date, Quantity, Customer, OrderingCode) as (values
  (12345, 122, 123, 12, '12/12/2018', 2, 123, 567)
, (12345, 122, 123, 15, '12/12/2018', 2, 123, 567)
, (12345, 516, 123, 63, '12/12/2018', 5, 123, 567)
, (12345, 617, 123, 14, '12/12/2018', 7, 123, 567)
, (12345, 617, 123, 14, '12/12/2018', 4, 123, 567)
, (12345, 617, 123, 17, '12/12/2018', 2, 123, 567)
, (12345, 745, 123, 43, '12/12/2018', 2, 123, 567)
)
, p as (
select ID, Quantity, Date, ordNumber
from new table (
insert into products (Detail1, Detail2, Detail3, Customer, OrderingCode, Date)
include (OrdNumber int, Quantity int)
select Detail1, Detail2, Detail3, Customer, OrderingCode, Date, OrdNumber, Quantity
from (
select Detail1, Detail2, Detail3, Customer, OrderingCode, Date, OrdNumber, Quantity
, rownumber() over (partition by Detail1, Detail2, Detail3 order by Quantity desc) rn_
from r
) where rn_=1
)
)
select count(1) 
from new table (
insert into Orders (P_ID, Quantity, Date, orderNumber)
select ID, Quantity, Date, ordNumber
from p
);

В предложении 1-й WITH (обозначается r) есть набор результатов, который вы получаете по запросу. Пара выбирает из data-change operation используется тогда.

1-я единица (упоминаемая как p) вставляет необходимые строки в Products и генерируется ID s для этих строк.

2-я (самая последняя) вставляет строки в Orders, используя сгенерированные идентификаторы и другие необходимые поля.

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