2017-09-23 30 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 

出力は、1行(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; 
関連する問題