将行乘以重复行的列
Multiples rows to columns with repeated rows
我知道这个主题在这里已经很好地暴露了,但我相信我有一个特定的案例,到目前为止我没有找到任何解决方案。
我有以下结果集:
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,但我无法处理它必须使用聚合函数的事实,该函数会产生一行结果集(只是最大值或最小值等)
你能帮我吗?
让我假设每一行都有一个唯一的、递增的 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;
你也可以这样试试,
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
我知道这个主题在这里已经很好地暴露了,但我相信我有一个特定的案例,到目前为止我没有找到任何解决方案。
我有以下结果集:
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,但我无法处理它必须使用聚合函数的事实,该函数会产生一行结果集(只是最大值或最小值等)
你能帮我吗?
让我假设每一行都有一个唯一的、递增的 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;
你也可以这样试试,
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