Объединение нескольких строк в несколько столбцов

Я работаю над проектом, в котором мне нужно объединиться с существующей таблицей, поэтому мне нужно преобразовать все строки с одним и тем же идентификатором в несколько столбцов.

Таблица выглядит так, для 1 продукта может быть несколько комиссионеров (максимум 6), а номер комиссии уникален.

ProudctID  |  Name  |   Label  | Commission| CommissionID 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 47        |  John  |   Owner  |   50.0    |   1
 47        |  Steve |   Owner  |   40.0    |   2
 47        |  Giana |   Manager|   10.0    |   3

Мне нужно объединить эту таблицу с таблицей продуктов для отчета, где для каждого идентификатора продукта есть несколько столбцов с данными о комиссии.

ProudctID  |  Name1  |   Label1  | Commission1 |  Name2  |   Label2  | Commission2 |  Name3  |   Label3  | Commission3 | 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47         |  John   |   Owner   |    50.0     |  Steve  |   Owner   |   40.0      |  Giana  |   Manager |   10.0      |

Я пробовал PIVOT таким образом, но он не работает, я также пытался изменить переменные поворота, но это не дало никаких результатов. Просто NULL в новых столбцах.

Select * from 
    (select PC.CommissionID, 
        PC.ProductID, 
        PC.Commission, 
        PC.Name,
        PC.Label
     from ProductCommission PC
     where PC.ProductID = 47 and PC.Deleted = 0
     ) d
     pivot (max(CommissionID) for Name in ( 
     Name1, CommisionLabel1,  Commission1,
     Name2, CommisionLabel2,  Commission2,
     Name3, CommisionLabel3,  Commission3)) 
     pvt;

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

John Cappelletti 24.11.2022 19:16

Я пробовал этот подход к объединению, но мои имена столбцов не являются динамическими, поэтому не сработало: [ссылка] (stackoverflow.com/questions/21692871/…)

beginnerdev 24.11.2022 19:17

Вы пометили динамический свод, но ваши 3 сводных столбца кажутся фиксированными, и вам нужно максимум 6 групп сводных строк? Я бы согласился с тем, что использование pivot громоздко, просто агрегируйте с использованием условных выражений case. У вас есть commissionId 1 до 6 на каждый ProductId?

Stu 24.11.2022 19:19

@Stu Да, commissionId может быть до 6 для каждого ProductId. Я новичок в SQL, поэтому решил, что динамическая ось поможет, и удалил этот тег.

beginnerdev 24.11.2022 19:23
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
4
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если у вас есть известное или максимальное количество столбцов, вот условное агрегирование

Условные агрегации предлагают немного большую гибкость, чем PIVOT, и они могут поддерживать типы данных.

Select ProductID  
      ,Name1       = max(case when RN=1 then A.Name end)
      ,Label1      = max(case when RN=1 then A.Label end)
      ,Commission1 = max(case when RN=1 then A.Commission end)
      ,Name2       = max(case when RN=2 then A.Name end)
      ,Label2      = max(case when RN=2 then A.Label end)
      ,Commission2 = max(case when RN=2 then A.Commission end)
      ,Name3       = max(case when RN=3 then A.Name end)
      ,Label3      = max(case when RN=3 then A.Label end)
      ,Commission3 = max(case when RN=3 then A.Commission end)
      ,Name4       = max(case when RN=4 then A.Name end)
      ,Label4      = max(case when RN=4 then A.Label end)
      ,Commission4 = max(case when RN=4 then A.Commission end)
 From  (
        Select *
              ,RN = row_number() over (partition by ProductID order by (select null)) 
         from YourTable
       ) A 
 Group By ProductID

Полученные результаты

Вместо row_number вы можете просто использовать существующий столбец CommissionId.

Stu 24.11.2022 19:30

@Stu Я вижу это в комментариях ... Однако могут ли Джон и «Бетси» иметь одинаковую комиссию / идентификатор?

John Cappelletti 24.11.2022 19:32

Конечно. Я думаю, ОП знает свои данные и может решить.

Stu 24.11.2022 19:34

Другие вопросы по теме