取消显示不显示欲望结果的多个列

时间:2015-09-04 14:33:53

标签: sql sql-server sql-server-2012-express

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

如果我只用一列执行(Product,注释掉Code),那么我将在ID列(1,2)中有2个值。如果我用2列运行查询,那么我在ID列(1,2,3,4)中得到4个值。

1 个答案:

答案 0 :(得分: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