Sql server 消除列之间的重复项

Sql server 消除列之间的重复项,sql-server,tsql,Sql Server,Tsql,假设我有下表(大表的一小部分): 我有10列带有ID号-但是我想以有效的方式消除任何重复项。我有点想避免在变得越来越复杂时,我添加的列越多,就必须执行案例 也许这是唯一的解决办法,但我想看看是否有人对如何实现这一点有更好的想法。我真的不在乎哪一个被删除或不被删除——只要我只剩下跨列的唯一值(我想从保持最左边的值并向右移动开始可能最容易——但我愿意接受建议) 我的预期结果如下: | B11_1_siknr | B11_2_siknr | B12_siknr | B21_siknr | B22_1_

假设我有下表(大表的一小部分):

我有10列带有ID号-但是我想以有效的方式消除任何重复项。我有点想避免在变得越来越复杂时,我添加的列越多,就必须执行
案例

也许这是唯一的解决办法,但我想看看是否有人对如何实现这一点有更好的想法。我真的不在乎哪一个被删除或不被删除——只要我只剩下跨列的唯一值(我想从保持最左边的值并向右移动开始可能最容易——但我愿意接受建议)

我的预期结果如下:

| B11_1_siknr | B11_2_siknr | B12_siknr | B21_siknr | B22_1_siknr | B22_2_siknr | B31_siknr | B32_siknr | B41_siknr | B42_siknr |
|-------------|-------------|-----------|-----------|-------------|-------------|-----------|-----------|-----------|-----------|
| 6029879318  | 6020430002  | NULL      | NULL      | NULL        | NULL        | NULL      | NULL      | NULL      | NULL      |

谢谢。

这里有一种方法是旋转和取消旋转

;WITH cte
     AS (SELECT CASE
                  WHEN val IS NOT NULL
                       AND Row_number()OVER(partition BY val ORDER BY ord) = 1 THEN val
                  ELSE NULL
                END val,
                ord
         FROM   Yourtable
                CROSS apply (VALUES ([B11_1_siknr],1),([B11_2_siknr],2),([B12_siknr],3),([B21_siknr],4),
                                    ([B22_1_siknr],5),([B22_2_siknr],6),([B31_siknr],7),([B32_siknr],8),
                                    ([B41_siknr],9),([B42_siknr],10))tc (val, ord))
SELECT B11_1_siknr = [1],
       B11_2_siknr = [2],
       ...
FROM   cte
       PIVOT (Max(val)
             FOR ord IN ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10]))pv 
您可以使用unpivot:

if object_id('dbo.pvt') is not null drop TABLE dbo.pvt 
CREATE TABLE dbo.pvt 
(   
    id int identity(1,1),
    B11_1_siknr int, B11_2_siknr int, B12_siknr int, B21_siknr int, B22_1_siknr int, B22_2_siknr int, B31_siknr int, B32_siknr int, B41_siknr int, B42_siknr int
);  

INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (1,4,3,5,4,4,1,4,3,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (2,4,1,5,5,5,2,4,1,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (3,4,3,5,4,4,3,4,3,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (4,4,2,5,5,4,4,4,2,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (5,5,1,5,5,5,5,5,1,5);  

--unpivot
SELECT id, ptb, sikn
FROM   
   (SELECT id, B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr)  
)AS unpvt; 

--unpivot distinct 
SELECT distinct sikn
FROM   
   (SELECT id, B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr)  
)AS unpvt; 


--dynamic unpivot
DECLARE @cols nvarchar(max) = (SELECT ((SELECT N',' + name from sys.columns where object_id = object_id('dbo.pvt') and name like '%siknr' for xml path(''), type).value('substring(./text()[1],2)','nvarchar(max)')));
--print @cols;

-- Unpivot the table.  
DECLARE @sql nvarchar(max) = 
N'SELECT id, ptb, sikn
FROM   
   (SELECT id, ' + @cols + N'
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (' + @cols + N')  
)AS unpvt'; 
EXEC(@sql);

-- Unpivot distinct the table.  
set @sql = 
N'--distinct ids
SELECT sikn
FROM   
   (SELECT id, ' + @cols + N'
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (' + @cols + N')  
)AS unpvt; '; 
EXEC(@sql);

这似乎只适用于一行数据,但是我有1.700行类似于上面的:-)
if object_id('dbo.pvt') is not null drop TABLE dbo.pvt 
CREATE TABLE dbo.pvt 
(   
    id int identity(1,1),
    B11_1_siknr int, B11_2_siknr int, B12_siknr int, B21_siknr int, B22_1_siknr int, B22_2_siknr int, B31_siknr int, B32_siknr int, B41_siknr int, B42_siknr int
);  

INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (1,4,3,5,4,4,1,4,3,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (2,4,1,5,5,5,2,4,1,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (3,4,3,5,4,4,3,4,3,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (4,4,2,5,5,4,4,4,2,5);  
INSERT INTO dbo.pvt (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr) VALUES (5,5,1,5,5,5,5,5,1,5);  

--unpivot
SELECT id, ptb, sikn
FROM   
   (SELECT id, B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr)  
)AS unpvt; 

--unpivot distinct 
SELECT distinct sikn
FROM   
   (SELECT id, B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (B11_1_siknr, B11_2_siknr , B12_siknr , B21_siknr , B22_1_siknr , B22_2_siknr , B31_siknr , B32_siknr , B41_siknr , B42_siknr)  
)AS unpvt; 


--dynamic unpivot
DECLARE @cols nvarchar(max) = (SELECT ((SELECT N',' + name from sys.columns where object_id = object_id('dbo.pvt') and name like '%siknr' for xml path(''), type).value('substring(./text()[1],2)','nvarchar(max)')));
--print @cols;

-- Unpivot the table.  
DECLARE @sql nvarchar(max) = 
N'SELECT id, ptb, sikn
FROM   
   (SELECT id, ' + @cols + N'
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (' + @cols + N')  
)AS unpvt'; 
EXEC(@sql);

-- Unpivot distinct the table.  
set @sql = 
N'--distinct ids
SELECT sikn
FROM   
   (SELECT id, ' + @cols + N'
   FROM  dbo.pvt ) p  
UNPIVOT  
   (sikn FOR ptb IN   
      (' + @cols + N')  
)AS unpvt; '; 
EXEC(@sql);