首先我会考虑在程序端实现: 订单325375,直接生成列 1|2|4|10|9。 订单325376,1可以利用第1列,5不存在要添加列,依次类推同样的过程用游标来实现 WITH test(OrderID,ID,BomID,ProcessID,Sort) AS ( SELECT 325375,1,75400,1,1 UNION ALL SELECT 325375,2,75400,2,2 UNION ALL SELECT 325375,3,75400,4,3 UNION ALL SELECT 325375,4,75400,10,4 UNION ALL SELECT 325375,5,75400,9,5 UNION ALL SELECT 325376,6,24378,1,1 UNION ALL SELECT 325376,7,24378,5,2 UNION ALL SELECT 325376,8,24378,2,3 UNION ALL SELECT 325376,9,24378,4,4 UNION ALL SELECT 325376,10,24378,9,5 UNION ALL SELECT 325377,11,39228,1,1 UNION ALL SELECT 325377,12,39228,2,2 UNION ALL SELECT 325377,13,39228,4,3 UNION ALL SELECT 325377,14,39228,8,4 UNION ALL SELECT 325377,15,39228,7,5 UNION ALL SELECT 325377,16,39228,9,6 ) SELECT * INTO #tb1 FROM test;CREATE TABLE #tb2 ( OrderID int, ID int, BomID int, ColNo int )CREATE TABLE #tb3 ( ColNo int, ProcessID int )DECLARE @lastOrderID int DECLARE @ColNo int DECLARE @maxColNo int SET @lastOrderID = 0 SET @maxColNo = 0DECLARE @OrderID int DECLARE @ID int DECLARE @BomID int DECLARE @ProcessID int DECLARE @Sort intDECLARE c_tb1 CURSOR FOR SELECT * FROM #tb1 ORDER BY OrderID,SortOPEN c_tb1FETCH NEXT FROM c_tb1 INTO @OrderID,@ID,@BomID,@ProcessID,@SortWHILE @@FETCH_STATUS = 0 BEGIN IF (@lastOrderID <> @OrderID) BEGIN SET @ColNo = 0; SET @lastOrderID = @OrderID; END SET @ColNo = (SELECT Min(ColNo) FROM #tb3 WHERE ColNo > @ColNo AND ProcessID = @ProcessID ); IF (@ColNo IS NULL) BEGIN SET @maxColNo = @maxColNo + 1; INSERT INTO #tb3 VALUES (@maxColNo,@ProcessID); SET @ColNo = @maxColNo; END INSERT INTO #tb2 VALUES(@OrderID,@ID,@BomID,@ColNo) FETCH NEXT FROM c_tb1 INTO @OrderID,@ID,@BomID,@ProcessID,@Sort ENDCLOSE c_tb1 DEALLOCATE c_tb1 --SELECT * FROM #tb2 ORDER BY OrderID,ColNo --SELECT * FROM #tb3-- 以下为动态PIVOT DECLARE @sql varchar(max), @columns varchar(max), @columnHeaders varchar(max)SET @columns = '' SET @columnHeaders = '' SELECT @columns = @columns + ', [' + Convert(varchar(11),ColNo) + ']', @columnHeaders = @columnHeaders + ', [' + Convert(varchar(11),ColNo) + '] AS [' + Convert(varchar(11),ProcessID) + ']' FROM #tb3 ORDER BY ColNoSET @sql = ' SELECT OrderID AS [订单明细号], BomID AS [BOM编号], ' + STUFF(@columnHeaders,1,2,'') + ' FROM #tb2 PIVOT ( Max (ID) FOR ColNo IN ( ' + STUFF(@columns,1,2,'') + ') ) AS p ORDER BY OrderID' --PRINT @sql EXEC (@sql) 订单明细号 BOM编号 1 2 4 10 9 5 2 4 9 8 7 9 ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- 325375 75400 1 2 3 4 5 NULL NULL NULL NULL NULL NULL NULL 325376 24378 6 NULL NULL NULL NULL 7 8 9 10 NULL NULL NULL 325377 39228 11 12 13 NULL NULL NULL NULL NULL NULL 14 15 16
订单明细号 BOM编号 主键序
---------- ------- ------------------
325375 75400 1,2,3,4,5
325376 24378 6,7,8,9,10
订单325375,直接生成列 1|2|4|10|9。
订单325376,1可以利用第1列,5不存在要添加列,依次类推同样的过程用游标来实现
WITH test(OrderID,ID,BomID,ProcessID,Sort) AS (
SELECT 325375,1,75400,1,1 UNION ALL
SELECT 325375,2,75400,2,2 UNION ALL
SELECT 325375,3,75400,4,3 UNION ALL
SELECT 325375,4,75400,10,4 UNION ALL
SELECT 325375,5,75400,9,5 UNION ALL
SELECT 325376,6,24378,1,1 UNION ALL
SELECT 325376,7,24378,5,2 UNION ALL
SELECT 325376,8,24378,2,3 UNION ALL
SELECT 325376,9,24378,4,4 UNION ALL
SELECT 325376,10,24378,9,5 UNION ALL
SELECT 325377,11,39228,1,1 UNION ALL
SELECT 325377,12,39228,2,2 UNION ALL
SELECT 325377,13,39228,4,3 UNION ALL
SELECT 325377,14,39228,8,4 UNION ALL
SELECT 325377,15,39228,7,5 UNION ALL
SELECT 325377,16,39228,9,6
)
SELECT *
INTO #tb1
FROM test;CREATE TABLE #tb2 (
OrderID int,
ID int,
BomID int,
ColNo int
)CREATE TABLE #tb3 (
ColNo int,
ProcessID int
)DECLARE @lastOrderID int
DECLARE @ColNo int
DECLARE @maxColNo int
SET @lastOrderID = 0
SET @maxColNo = 0DECLARE @OrderID int
DECLARE @ID int
DECLARE @BomID int
DECLARE @ProcessID int
DECLARE @Sort intDECLARE c_tb1 CURSOR FOR
SELECT *
FROM #tb1
ORDER BY OrderID,SortOPEN c_tb1FETCH NEXT FROM c_tb1
INTO @OrderID,@ID,@BomID,@ProcessID,@SortWHILE @@FETCH_STATUS = 0
BEGIN
IF (@lastOrderID <> @OrderID)
BEGIN
SET @ColNo = 0;
SET @lastOrderID = @OrderID;
END SET @ColNo = (SELECT Min(ColNo)
FROM #tb3
WHERE ColNo > @ColNo
AND ProcessID = @ProcessID
); IF (@ColNo IS NULL)
BEGIN
SET @maxColNo = @maxColNo + 1;
INSERT INTO #tb3 VALUES (@maxColNo,@ProcessID);
SET @ColNo = @maxColNo;
END INSERT INTO #tb2 VALUES(@OrderID,@ID,@BomID,@ColNo) FETCH NEXT FROM c_tb1
INTO @OrderID,@ID,@BomID,@ProcessID,@Sort
ENDCLOSE c_tb1
DEALLOCATE c_tb1
--SELECT * FROM #tb2 ORDER BY OrderID,ColNo
--SELECT * FROM #tb3-- 以下为动态PIVOT
DECLARE @sql varchar(max),
@columns varchar(max),
@columnHeaders varchar(max)SET @columns = ''
SET @columnHeaders = '' SELECT @columns = @columns + ', [' + Convert(varchar(11),ColNo) + ']',
@columnHeaders = @columnHeaders + ', [' + Convert(varchar(11),ColNo) + '] AS [' + Convert(varchar(11),ProcessID) + ']'
FROM #tb3
ORDER BY ColNoSET @sql = '
SELECT OrderID AS [订单明细号],
BomID AS [BOM编号],
' + STUFF(@columnHeaders,1,2,'') + '
FROM #tb2
PIVOT (
Max (ID)
FOR ColNo IN ( ' + STUFF(@columns,1,2,'') + ')
) AS p
ORDER BY OrderID'
--PRINT @sql
EXEC (@sql)
订单明细号 BOM编号 1 2 4 10 9 5 2 4 9 8 7 9
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
325375 75400 1 2 3 4 5 NULL NULL NULL NULL NULL NULL NULL
325376 24378 6 NULL NULL NULL NULL 7 8 9 10 NULL NULL NULL
325377 39228 11 12 13 NULL NULL NULL NULL NULL NULL 14 15 16