水平呈现数据而不是垂直呈现数据

时间:2017-09-26 11:13:54

标签: sql sql-server tsql

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

2 个答案:

答案 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