将行乘以具有重复行的列

时间:2017-03-01 23:19:58

标签: sql sql-server pivot

我知道这个主题已在这里曝光,但我相信我是一个特定的案例,到目前为止我还没有找到任何解决方案。

我有以下结果集:

Tp_Parameter    Value       Order_Id
------------    -----       --------    
Colour          Black       3824
Size            S           3824
Qty             2           3824
ItemId          101         3824
Colour          White       3824
Size            M           3824
Qty             1           3824
ItemId          102         3824
Colour          Red         3824
Size            L           3824
Qty             4           3824
ItemId          105         3824

我正在寻找这样的结果集:

Order_Id    ItemId  Colour  Size    Qty
--------    ------  ------  ----    ---
3824        101     Black   S       2
3824        102     White   M       1
3824        105     Red     L       4

我尝试使用 pivot ,但我无法处理必须使用聚合函数的事实,这会导致一行结果集(只是MAX或MIN等等)

你可以帮帮我吗?

2 个答案:

答案 0 :(得分:1)

让我假设每行都有一个唯一的,增加的id。然后我们可以说一个特定的" ItemId"完成项目的行。

如果是这样的话:

select order_id,
       max(case when tp_parameter = 'ItemId' then value end) as ItemId,
       max(case when tp_parameter = 'Colour' then value end) as Colour,
       max(case when tp_parameter = 'Size' then value end) as Size,
       max(case when tp_parameter = 'Qty' then value end) as Qty
from (select t.*,
             sum(case when tp_parameter = 'ItemId' then 1 else 0 end) over (partition by order_id order by <id> desc) as item_grp
      from t
     ) t
group by item_grp, order_id;

答案 1 :(得分:0)

你也可以这样试试,

declare @t table(Tp_Parameter varchar(50)
,Value varchar(50),Order_Id int)

insert into @t VALUES

 ('Colour'   ,'Black',3824)
,('Size'   ,'S',3824)
,('Qty'   ,'2',3824)
,('ItemId'   ,'101',3824)
,('Colour'   ,'White',3824)
,('Size'   ,'M',3824)
,('Qty'   ,'1',3824)
,('ItemId'   ,'102',3824)
,('Colour'   ,'Red',3824)
,('Size'   ,'L',3824)
,('Qty'   ,'4',3824)
,('ItemId'   ,'105',3824)
;with CTE as
(
select *,ROW_NUMBER()over(order by (select NULL))rn
 from @t
 )
 select * 
 ,(select top 1 value from cte b 
 where tp_parameter='ItemId' and b.rn>=a.rn order by rn)MissingItemid
 from cte a

--now apply dynamic pivot so that you do not have to hard code parameter