我有两个表:customerTable
和orderTable
那个如下所示。我需要order
动态生成列。
客户表
custId CustName
01 Suresh
02 Ramesh
订单表
custId OrderId
01 011
01 012
需要像这样的输出:
custId Order1 Order2
01 011 012
在这里,如果每个客户的订单是多次,则将动态添加列。
如果custId = 01有011,012,013,014 ......有很多命令,那么表将像
custId order1 order2 order3 order4 order5 order6 ...... many oder N columns
01 011 012 013 014 015 06 ....... 0N..
像这样动态地执行此操作:
declare @sql as nvarchar(max)
declare @cols as nvarchar(max)
set @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.OrderId)
FROM OrderTable c
order by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @sql = STUFF((SELECT ',' + QUOTENAME(OrderId) + ' as Order' + convert(varchar,row_number() over (order by OrderId))
from (
select distinct OrderId
FROM OrderTable
) t
order by 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'');
set @sql = 'SELECT custId, ' + @sql + ' from
(
select *
from OrderTable
) x
pivot
(
max(OrderId)
for OrderId in (' + @cols + ')
) p '
exec(@sql)
产生:
这里要注意的是,由于列是根据透视结果中的OrderId对齐的,因此它对于一个custId可以正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句