2017-09-23 1 views
1

UPS/Fedex 추적 번호에 대해 60 개 이상의 열을 포함하는 넓은 테이블이 있습니다. 나는 열의 수를 줄이고 부모와 자식 간의 관계를 갖기 위해 노력하고 있습니다.SQL Server - 여러 열을 여러 행으로 변환

SELECT 
    [TRACKING-NO1], [TRACKING-NO2], [TRACKING-NO3], [TRACKING-NO4], 
    [TRACKING-NO5], [TRACKING-NO6], [TRACKING-NO7], [TRACKING-NO8], 
    [TRACKING-NO9], [TRACKING-NO10] 
FROM 
    [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable] 
WHERE 
    [TRACKING-NO2] IS NOT NULL 

출력은 한 행 (60+) 열의 모든 추적 번호 목록을 반환합니다. 하위 추적 번호가 있으면 2 - 60 열이 채워집니다. 하위 추적 번호가 없으면 2 - 60은 NULL입니다.

부모 추적 번호와 관련 하위 추적 번호 및 자식임을 나타내는 플래그가 있어야합니다.

Current Structure

New Output

당신이 제공 할 수있는 어떤 도움을 크게 감상 할 수

...

답변

0

우리는 행으로 변환 열에 대한 UNPIVOT를 사용해야합니다.

그러나 UNPIVOT은 하위 열이없는 행을 반환하지 않습니다.

그런 이유로 우리는 이러한 종류의 행을 추가로 결정해야합니다. 그것은 단지 기본 테이블에 단일 패스를 걸립니다 다음은 훨씬 더 빠르게 처리 될 수

SELECT 
    [TRACKING-NO1] TrackingNumberParent , 
    'TRUE' TrackingNumberChildren 
    ,TrackingNumberChild 
FROM 
    (SELECT * FROM [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable]) SRC 
     UNPIVOT(TrackingNumberChild FOR COL IN (
      [TRACKING-NO2], 
      [TRACKING-NO3], 
      [TRACKING-NO4], 
      [TRACKING-NO5], 
      [TRACKING-NO6], 
      [TRACKING-NO7], 
      [TRACKING-NO8], 
      [TRACKING-NO9], 
      [TRACKING-NO10])) PVT 
UNION ALL 
SELECT 
    [TRACKING-NO1] TrackingNumberParent, 
    'FALSE' TrackingNumberChildren, 
    NULL TrackingNumberChild 
FROM 
    [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable] 
WHERE 
    [TRACKING-NO2] IS NULL 
ORDER BY 
    TrackingNumberParent 
+0

감사합니다! 이것은 내가 필요한 것입니다! 잘 했어! –

+0

당신을 진심으로 환영합니다. 대답이 맞으면 대답 체크를 클릭하십시오. –

0

...

SELECT 
    TrackingNumberParent = iot.[TRACKING-NO1], 
    TrackingNumberChildren = CASE WHEN ctn.[TRACKING-NO] IS NULL THEN 'False' ELSE 'True' END, 
    TrackingNumberChild = ctn.[TRACKING-NO] 
FROM 
    [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable] iot 
    OUTER APPLY ( 
       SELECT 
        tn.COL_NO, 
        tn.[TRACKING-NO] 
       FROM (VALUES 
        (2, iot.[TRACKING-NO2]), (3, iot.[TRACKING-NO3]), (4, iot.[TRACKING-NO4]), 
        (5, iot.[TRACKING-NO5]), (6, iot.[TRACKING-NO6]), (7, iot.[TRACKING-NO7]), 
        (8, iot.[TRACKING-NO8]), (9, iot.[TRACKING-NO9]), (10, iot.[TRACKING-NO10]) 
        ) tn (COL_NO, [TRACKING-NO]) 
       WHERE 
        (
         tn.[TRACKING-NO] IS NOT NULL 
         OR 
         tn.COL_NO = 2 
        ) 
       ) ctn; 
관련 문제