SQL-запрос для выполнения поиска с транспонированием - PullRequest
0 голосов
/ 23 сентября 2019

Я хотел бы добиться следующего и, честно говоря, я даже не знаю, с чего начать.У нас есть две таблицы: клиенты и заказы.Мне нужно создать третью таблицу, которая будет иметь объединенные данные и отображаться горизонтально.

Это текущие таблицы:

ЗАКАЗЧИКИ:

             Id           Email          Language  
Customer1     1       cust1@email.com       en          
Customer2     2       cust2@email.com       sp         
Customer3     3       cust3@email.com       ru 

ЗАКАЗЫ:

        Id         CustomerId        Total
         a              1             200      
         b              1             300     
         c              2             400   
         d              3             500   
         e              3             500   
         f              3             500   
         g              3             500   

И желаемый результат:

CustomerID  Email  Language  Order1   Order2   Order3   Order4   Order5   Order6
    1                           a        b        -        -        -        -
    2                           c        -        -        -        -        -
    3                           d        e        f        g        -        -

Каждый клиент может иметь до 6 активных заказов, но логика также может заключаться в том, что для каждого клиента будут перечислены только 6 первых заказов.Любые предложения о том, как достичь этого результата?Ваша помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 23 сентября 2019

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

Тогда вы можете сделать это с помощью условного агрегирования:

select c.id, c.email, c.language,
       max(case when seqnum = 1 then o.id end) as order_1,
       max(case when seqnum = 2 then o.id end) as order_2,
       max(case when seqnum = 3 then o.id end) as order_3,
       max(case when seqnum = 4 then o.id end) as order_4,
       max(case when seqnum = 5 then o.id end) as order_5,
       max(case when seqnum = 6 then o.id end) as order_6
from customers c left join
     (select o.*,
             row_number() over (partition by customerid order by id) as seqnum
      from orders o
     ) o
     on c.customerid = o.customerid
group by c.id, c.email, c.language;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...