Я работаю над проектом, в котором мне нужно объединиться с существующей таблицей, поэтому мне нужно преобразовать все строки с одним и тем же идентификатором в несколько столбцов.
Таблица выглядит так, для 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;
Я пробовал этот подход к объединению, но мои имена столбцов не являются динамическими, поэтому не сработало: [ссылка] (stackoverflow.com/questions/21692871/…)
Вы пометили динамический свод, но ваши 3 сводных столбца кажутся фиксированными, и вам нужно максимум 6 групп сводных строк? Я бы согласился с тем, что использование pivot громоздко, просто агрегируйте с использованием условных выражений case. У вас есть commissionId
1 до 6 на каждый ProductId
?
@Stu Да, commissionId
может быть до 6 для каждого ProductId
. Я новичок в SQL, поэтому решил, что динамическая ось поможет, и удалил этот тег.
Если у вас есть известное или максимальное количество столбцов, вот условное агрегирование
Условные агрегации предлагают немного большую гибкость, чем 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 Я вижу это в комментариях ... Однако могут ли Джон и «Бетси» иметь одинаковую комиссию / идентификатор?
Конечно. Я думаю, ОП знает свои данные и может решить.
Поскольку у вас есть смешанные типы данных, условная агрегация может быть более подходящей.