我对SQL很新,但有了这个,我的IT部门已经问过我是否可以提供帮助,因为他们没有全力以赴。
我们有一个名为dbo_Xrefs的表,其中包含所有竞争对手的交叉引用,因此有很多重复数据,请参阅图1 ,我需要的是我的数据,如图2
非常感谢任何帮助。
Fig1
PartNo CompName CompNo
BC2095 A.B.S. 520831
BC2095 amk TCA3135
BC2095 APEC braking LCA235
BC2095 ATE 220635
BC2095 ATE 24.3384-1755.7
BC2095 AUDI 1K0615423A
BC2095 AUDI 1K0615423D
BC2095 AUDI 1K0615423J
Fig2
PartNo amk ATE ATE1 AUDI AUDI 1 AUDI 2
BC2095 TCA3135 220635 24.3384-1755.7 1K0615423A 1K0615423D 1K0615423J
答案 0 :(得分:1)
您需要使用row_number()
为CompName
分区的每个PartNo,CompName
编号(从0开始为-1),以便与pivot()
一起使用。
我已将isnull(nullif(...,0,'') to turn
0用于空字符串。
对于使用示例数据的动态数据透视:
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
',' + quotename(CompName
+isnull(nullif(convert(nvarchar(10),row_number() over (
partition by PartNo,CompName
order by CompNo
)-1),0),'')
)
from Xrefs
for xml path (''), type).value('.','nvarchar(max)')
,1,1,'');
select @sql = '
select PartNo, ' + @cols + '
from (
select
PartNo
, rn=CompName+isnull(nullif(convert(nvarchar(10),row_number() over (
partition by PartNo,CompName
order by CompNo
)-1),0),'''')
, CompNo
from Xrefs
) as a
pivot (max([CompNo]) for [rn] in (' + @cols + ') ) p';
select @sql as CodeGenerated;
exec sp_executesql @sql;
rextester演示:http://rextester.com/XMXA2432
返回:
+--------+--------+---------+--------------+--------+----------------+------------+------------+------------+
| PartNo | A.B.S. | amk | APEC braking | ATE | ATE1 | AUDI | AUDI1 | AUDI2 |
+--------+--------+---------+--------------+--------+----------------+------------+------------+------------+
| BC2095 | 520831 | TCA3135 | LCA235 | 220635 | 24.3384-1755.7 | 1K0615423A | 1K0615423D | 1K0615423J |
+--------+--------+---------+--------------+--------+----------------+------------+------------+------------+
答案 1 :(得分:0)
您可以尝试动态查询,如下所示:
CREATE table source_table (PartNo VARCHAR(10),CompName varchar(100),CompNo varchar(100));
INSERT INTO source_table values
('BC2095','A.B.S','520831'),
('BC2095','aml','TCA3135'),
('BC2095','Apec braking','LCA235');
DECLARE @listCompName VARCHAR(MAX)
SELECT @listCompName=
COALESCE(@listCompName+'],[','') + CompName
FROM source_table
SET @listCompName='['+@listCompName+']'
DECLARE @qry VARCHAR(MAX)
SELECT @qry=
'select PartNo,'+@listCompName+' from'+
'('+
'select '+
'PartNo,CompName,CompNo '+
'from source_table'+
')src '+
'pivot'+
'( MAX(CompNo) FOR CompName in ('+@listCompName+') )p'
exec(@qry)
的 working demo 强>