我正在开发一个项目,需要将其合并到现有表中,因此我需要将具有相同 ID 的所有行转换为多列。
表格如下所示,对于 1 个产品,可以有多个佣金人员(最多 6 个),并且 CommissionID 是唯一的。
ProudctID | Name | Label | Commission| CommissionID
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
47 | John | Owner | 50.0 | 1
47 | Steve | Owner | 40.0 | 2
47 | Giana | Manager| 10.0 | 3
我需要将此表与产品表合并以生成报告,其中对于每个产品 ID,有多列包含佣金数据。
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;
最佳答案
如果您有已知或最大列数,这里是条件聚合
条件聚合比 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
结果
关于sql - 将多行合并为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74564811/