2017-05-06 6 views
0

버전 값 : 마이크로 소프트 SQL 서버 2014SQL 서버 : 일종의 동적 피벗과 LIKE 열에

나는 성공적으로 (도움) 동적 피벗 테이블을 만들었습니다, 지금은 열 이름과 값에 대한 질문이 있습니다 . 테이블이 선회 한 후

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

SELECT @cols = STUFF((SELECT distinct ',' 
         + QUOTENAME('Component_' + cast(rn as varchar(10))) 
         FROM dbo.table 
         CROSS APPLY 
          (SELECT row_number() over(partition by UPC order by ComponentNum) rn 
          FROM dbo.table) x 
        FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @query = 'SELECT UPC, ' + @cols + ' FROM 
      (
       SELECT UPC, ComponentNum, 
        ''Component_'' 
        + cast(row_number() over(partition by UPC order by ComponentNum) as varchar(10)) val 
       FROM dbo.table) x 
      PIVOT 
      (
       MAX(ComponentNum) 
       FOR val IN (' + @cols + ') 
      ) p ' 

execute(@query) 

, 그것은 Component_X 27 개의 열을 만들었다.

27 개의 열은 고유 한 UPC 번호와 관련된 여러 종류의 부품을 나타냅니다. 모든 UPC가 27 가지 종류의 부품을 가지고있는 것은 아닙니다.

분할 된 UPC 번호 그룹의 행 번호가 피벗 열에 할당 된 행 번호에 따라 달라지는 것 같습니다.

필자는 피벗을 실행하기 전에 원본 데이터를 정렬해야한다는 것을 나타냅니다. 아래의 결과 표를 보면 부품 번호 543이 다른 UPC 번호에 대해 Component_13, Component_1Component_10 아래에 표시됨을 알 수 있습니다.

ID   UPC  Component_13  Component_1  Component_10  
------------------------------------------------------------------------ 
1   123  543     NULL    345 
2   321  345     543     765 
3   213  654     345     NULL   
4   312  765     NULL    543 

제 문제점은 부품 번호가 다른 열 사이에서 뜨는 것을 허용 할 수 없다는 것입니다. 부품 번호가 "Component_13" 유형이면 해당 열에 머물러 야합니다.

내 목표는 Component_X의 각 반복이 특정 종류의 부품을 나타내는 것입니다.

Component_1 = Bolts 
Component_2 = Nuts 
Component_3 = Washers 

다른 문제

내가 또한 소프트웨어의 다른 조각에 의해 검색을 위해 자신의 칼럼에 여러 개의 "볼트"부품 번호를 열거 할 필요가있다. UPC 번호는 부품 번호가 다른 크기가 다른 "볼트"를 가질 수 있습니다.

ID   UPC  Bolt1  Bolt2  Bolt3  Nut1  Nut2  
------------------------------------------------------------------------ 
1   123  1.5   1   NULL  0.5  .375 
2   321  2.0  NULL  NULL  .625  NULL  
3   213  0.25  .875  .375  NULL  NULL   
4   312  NULL  NULL  NULL  1.25  .625 

이 아마 수 없습니다,하지만 난 사람이 용액에 도움을 줄 수 있는지 문의했다 : 같은

최종 결과 테이블을 볼 수 있었다.

답변

0

REPLICATE을 사용하면 쉽게 주문할 수있는 두 개 이상의 숫자를 생성 할 수 있습니다.

create table test(rn varchar(10)); 

insert into test 
values ('1'), ('2'), ('3'), ('4'), ('5'), ('6'), ('7'), ('8'), ('9'), ('10'), ('11'), ('12'); 

select num 
from 
    (select 'Component_' + replicate('0', 2 - len(rn)) + rn as num 
     from test) x 
order by num; 

결과 :

dbfiddle이 형식에 의해 자동으로 생성된다
| num   | 
| :----------- | 
| Component_01 | 
| Component_02 | 
| Component_03 | 
| Component_04 | 
| Component_05 | 
| Component_06 | 
| Component_07 | 
| Component_08 | 
| Component_09 | 
| Component_10 | 
| Component_11 | 
| Component_12 | 

dbfiddle here

+0

@marc_s – McNets