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