Развернуть несколько столбцов, не отображающих желаемый результат

Original
    RecordKey   Name Section1_Product   Section1_Code   Section2_Product   Section2_Code ......
    1           a         ff              22               
    2           b         gg              22
    3           c         hh              33


    RecordKey     Name      Section     Product      Code ......
    1               a           1         ff          22
    1               a           2
    2               b           1         gg          22
    2               b           2
    3               c           1         hh          22
    3               c           2

Я пытаюсь развернуть столбцы в строки. Некоторые разделы будут иметь нулевое значение.

SELECT RecordKey
 ,Name
 ,'Num_of_Sections' = ROW_NUMBER() OVER (PARTITION BY RecordKey ORDER BY ID)
 ,Product
 ,Code
FROM (
SELECT RecordKey, Name, Section1_Product, Section1_Code, Section2_Product, Section2_Code FROM Table
) M

UNPITVOT (
  Product FOR ID IN (Section1_Product, Section2_Product)
) p

UNPIVOT (
  Code FOR CO IN (Section1_Code, Section2_Code)
) c

Если я выполню только с одним столбцом (Продукт, закомментировать код), тогда у меня будет 2 значения в столбце ID (1,2). Если я запускаю запрос с двумя столбцами, я получаю 4 значения в столбце ID (1, 2, 3, 4).


person user1804925    schedule 04.09.2015    source источник


Ответы (1)


может, согласно моему предположению и вашим данным, мы можем достичь этого, используя Cross apply и Row_number

    declare @Record TABLE 
    ([RecordKey] int, 
    [Name] varchar(1), 
    [Section1_Product] varchar(2), 
    [Section1_Code] int, 
    [Section2_Product] varchar(2),
     [Section2_Code] int)
;

INSERT INTO @Record
    ([RecordKey], [Name], [Section1_Product], [Section1_Code],[Section2_Product],[Section2_Code])
VALUES
    (1, 'a', 'ff', 22,NULL,NULL),
    (2, 'b', 'gg', 22,NULL,NULL),
    (3, 'c', 'hh', 33,NULL,NULL)
;
    With cte as (
    Select T.RecordKey,
    T.Name,
    T.val,
    T.val1 from (
    select RecordKey,Name,val,val1 from @Record
    CROSS APPLY (VALUES
                ('Section1_Product',Section1_Product),
                ('Section2_Product',Section2_Product))cs(col,val)
    CROSS APPLY (VALUES
                ('Section1_Code',Section1_Code),
                ('Section2_Code',Section2_Code))css(col1,val1)
    WHERE val is NOT NULL)T
    )
Select  c.RecordKey,
        c.Name,
        c.RN,
        CASE WHEN RN = 2 THEN NULL ELSE c.val END Product,
        c.val1 Code 
            from (
Select RecordKey,
        Name,
        ROW_NUMBER()OVER(PARTITION BY val ORDER BY (SELECT NULL))RN,
        val,
        val1 from cte )C
person mohan111    schedule 04.09.2015
comment
Спасибо за помощь. Section2_Product и Section2_Code могут иметь значения или могут быть нулевыми, а файл содержит более 2 разделов. - person user1804925; 04.09.2015
comment
Просто добавьте значения в NULL Place и добавьте разделы и коды в Cross Apply, как 1 и 2 @user1804925. - person mohan111; 05.09.2015