2017-09-26 79 views
0

我对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

这里大部分人都希望格式化文本,没有图像 - 或者更糟 - 图像链接。 – jarlh

+0

这个答案可以帮助你:https://stackoverflow.com/questions/46391146/transform-rows-into-columns-ms-sql/46391999#comment79741931_46391999 –

+0

可能是一个'PIVOT'会是你以后但我怀疑您需要根据Comp Name值动态生成它。你能否提供更多来自外部参照表的细节(如jarlh所说的格式化文本) – SQLBadPanda

回答

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='['[email protected]+']' 
DECLARE @qry VARCHAR(MAX) 



SELECT @qry= 
'select PartNo,'[email protected]+' from'+ 
'('+ 
    'select '+ 
    'PartNo,CompName,CompNo '+ 
    'from source_table'+ 
')src '+ 
'pivot'+ 
'(MAX(CompNo) FOR CompName in ('[email protected]+'))p' 
exec(@qry) 

working demo

1

您将需要使用row_number()到每个编号由CompNamePartNo,CompName(-1分区启动从0开始)用于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 | 
+--------+--------+---------+--------------+--------+----------------+------------+------------+------------+