我知道这个主题已在这里曝光,但我相信我是一个特定的案例,到目前为止我还没有找到任何解决方案。
我有以下结果集:
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等等)
你可以帮帮我吗?
答案 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