sql - 将多行合并为多列

标签 sql sql-server pivot

我正在开发一个项目,需要将其合并到现有表中,因此我需要将具有相同 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

结果

enter image description here

关于sql - 将多行合并为多列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74564811/

相关文章:

java - 字段 'user_id' 没有默认值,但设置为 auto_increment

mysql - 对查询结果进行分组以获得这种格式

sql - 多对多关系中的最大值

sql - 使用 SqlDataReader 从 SQL Server 数据库读取数据时出错

sql - Oracle 中的数据透视表?

sql - 分组和切换列和行

c# - 如何在 SQL 中使用 IF EXISTS 检查是否检索到记录?

sql - 如何在 SQL Server 中创建数据集并处理每条记录?

python - 将多级索引的第一级旋转为多级列的第一级

SQL 日期比较仅使用日期而不是时间