2016-06-02 7 views
0

내가 찾고있는 것을 찾을 수 없으므로 이미 답변을 드렸다면 미리 사과하십시오.동적 피벗 테이블이 필요합니까?

부품 마스터의 각 부품에 대한 유효한 속성 목록을 얻기 위해 부품 마스터 테이블을이 속성 테이블에 조인 할 수있는 속성이있는 부품 번호 테이블을 갖고 싶습니다. 제품 라인에 따라 부품 번호에 따라 속성이 달라질 수 있습니다. 예를 들어 부품 번호 ABC의 속성 이름은 OD, ID 및 너비 일 수 있으며 부품 번호 XYZ는 색상 및 길이 만 가질 수 있습니다. 기록은 다음과 같이 보일 것입니다 :

ABC, OD, 10.125 
ABC, ID, 8.125 
ABC, WIDTH, 6.500 
XYZ, COLOR, Blue 
XYZ, LENGTH, 16.375 

아무 문제 없습니다. 제가 다음에하고 싶은 것은 레코드를 피벗하여 비슷한 제품 (제품 라인 별)에 대한 사양 시트를 작성할 수 있도록하는 것입니다. 제품군 별 테이블에는 필드 이름에 대한 속성 이름이 있습니다. 예를 들어, ABC 부분이 "Round Widgets"제품 그룹에 있고 XYZ 부분이 "Long Widgets"제품 그룹에 있습니다. 둥근 위젯에 대한 쿼리 테이블에는 PN, OD, ID 및 WIDTH 필드가 있고 Long 위젯에 대한 쿼리 테이블에는 PN, COLOR 및 LENGTH 필드가 있습니다. 각 필드 이름은 위에 설명 된 테이블의 속성 이름이고 부품 번호와 속성 값은 레코드 데이터입니다. 내가 PIVOT을 사용하는 많은 예제를 본 적이 있지만, 일반적으로 하드 코드 필드가 필요

ABC, 10.125, 8.125, 6.500 

: PN, OD, ID 및 WIDTH 데이터가 같을 것이다 피벗 테이블 필드에 대한

. 이 피벗을 공급하는 쿼리는 이미 제품 그룹별로 필터링되므로 쿼리의 각 부품 번호에는 피벗 할 필드 수가 같아야합니다.

미리 도움을 청하십시오.

+2

동적으로 생성되는 피벗 된 열의 쿼리는 어떤 이점이 있습니까? 왜 각 제품 카테고리에 대해 유사한, 그러나 별도의 피벗을 만들지 않습니까? 동적으로 생성 된 쿼리에는 예상 결과를 변경하는 동적 소비자가 필요합니다. * 둥근 위젯을 요청하여 3 번 열이 ID가 될 것이지만 Long Widgets 3 번 열을 요청하면 길이가 길어집니다. * –

+0

각 제품 라인에 대한 별도의 쿼리는 문제가되지 않으며 실제로 더 쉬운 방법 일 수 있습니다 왜냐하면 필자는 어쨌든 포맷 된 사양 시트를 다르게 필요로하기 때문입니다. 댓글 주셔서 감사합니다. – KeithS

답변

0

이렇게 할 수 있습니다.

동적 피벗 :

DECLARE @query VARCHAR(4000) 
DECLARE @years VARCHAR(2000) 
SELECT @years = STUFF((SELECT DISTINCT'],[' + [factor_label] 
      FROM [TEMP_lacp_factors] 
      ORDER BY '],[' + [factor_label] 
      FOR XML PATH('') 
      ), 1, 2, '') + ']' 
SET @query = 
'SELECT * FROM 
(
    SELECT [date_],[issue_id],[cusip],[Factor_value],[factor_label] 
    FROM [TEMP_lacp_factors] 
)t 
PIVOT (MAX([factor_value]) FOR [factor_label] 
IN ('[email protected]+')) AS pvt' 
EXECUTE (@query) 

동적 피벗 및 위치 선택 : - 테이블을 드롭; 당신은 동적으로 테이블 삭제 TEMPTABLE

--Start creating all objects for Dyanmic Pivot 
DECLARE @query VARCHAR(4000) 
DECLARE @years VARCHAR(2000) 
SELECT @years = STUFF((SELECT DISTINCT'],[' + [factor_label] 
      FROM [TEMP_lacp_factors] 
      ORDER BY '],[' + [factor_label] 
      FOR XML PATH('') 
      ), 1, 2, '') + ']' 
SET @query = 
-- Objects that are created above, are put into the table you are about to create below 
'SELECT * INTO tempTable FROM (SELECT * FROM 
(
    SELECT [date_],[issue_id],[cusip],[Factor_value],[factor_label] 
    FROM [TEMP_lacp_factors] 
)t 
PIVOT (MAX([factor_value]) FOR [factor_label] 
IN ('[email protected]+')) AS pvt) X' 
EXECUTE (@query) 

-- Select everything from the dynamically created table ('tempTable') to see results 
Select * from tempTable 

변경 귀하의 요구에 맞게 코드를 작성합니다.