代码之家  ›  专栏  ›  技术社区  ›  SQL_M

重复SQL查询并创建一个输出列

  •  5
  • SQL_M  · 技术社区  · 8 年前

    我被一个奇怪的问题困住了。我有一张桌子,基本上可以归结为:

    CREATE TABLE #Sample (ColA VARCHAR (20), ColB VARCHAR (20), ColC VARCHAR (20), ColD VARCHAR (10), ColE VARCHAR (10) )
    
    INSERT INTO #Sample VALUES ('6250', '1001', '12AA', '12AA', ''),
                               ('6250', '1002', '12AA', '12AA', ''),
                               ('6251', '1003', '12BB', '12BB', 'A'),
                               ('6252', '1004', '12CC', '12CC', '')
    

    我已收到一份装运订单的规格。对于ColB的每个值,我必须重复以下步骤,以便创建一个输出列。前两行是文本,第二行和第三行是前缀+B列和C列的值。作为奖励,只有当科尔被填补,我们必须选择一个前缀加科尔。

    这听起来可能很混乱,因此我将添加所需的输出:

    'A1 Text'
    'A2 Text'
    'ZZ62501001' -- ZZ prefix + ColA + ColB
    'ZZ12AA' -- ZZ prefix + ColC
    'A1 Text'
    'A2 Text'
    'ZZ62501002' -- ZZ prefix + ColA + ColB
    'ZZ12AA' -- ZZ prefix + ColC
    'A1 Text'
    'A2 Text'
    'ZZ62511003' -- ZZ prefix + ColA + ColB
    'ZZA' -- ZZ prefix + ColE (notice that this is only shown when ColE is filled)
    'ZZ12BB' -- ZZ prefix + ColC
    'A1 Text'
    'A2 Text'
    'ZZ62521004' -- ZZ prefix + ColA + ColB
    'ZZ12CC' -- ZZ prefix + ColC
    

    这种安排有很多错误,但我对这件事没有影响。所以我被手头的问题困住了。

    我的尝试是先创建一个“常规”输出表,然后尝试创建一个包含一列的新表。

    我的代码尝试,这是相当糟糕的,但我将包括它无论如何:

    CREATE TABLE #Output ( ColA VARCHAR (100),
                           ColB VARCHAR (100),
                           ColC VARCHAR (100),
                           ColD VARCHAR (100),
                           ColE VARCHAR (100) )
    
    
    DECLARE @Counter INT 
    SET @Counter = 1
    
    WHILE @Counter < ( SELECT MAX (RowNumb) FROM #Sample )
    
    BEGIN 
    
        INSERT INTO #Output
        SELECT 'A1 Text',
             'A2 Text',
             'ZZ' + ColA + ColB, -- ZZ prefix + ColA + ColB
             'ZZ' + ColC,
             'ZZ' + ColE
        FROM #Sample
    
    SET @Counter = @Counter + 1
    
    END
    
    SELECT * FROM #Output
    

    性能在这里不是一个真正的问题,处理几千行,所以游标或循环不是问题。

    1 回复  |  直到 8 年前
        1
  •  5
  •   KeithL    8 年前

    使用交叉应用,可以为每行构建多行:

    declare @Sample table (ColA VARCHAR (20), ColB VARCHAR (20), ColC VARCHAR (20), ColD VARCHAR (10), ColE VARCHAR (10) )
    
    INSERT INTO @Sample VALUES ('6250', '1001', '12AA', '12AA', ''),
                               ('6250', '1002', '12AA', '12AA', ''),
                               ('6251', '1003', '12BB', '12BB', 'A'),
                               ('6252', '1004', '12CC', '12CC', '')
    
    
    
    select a.results
    from @Sample
        cross apply (values ('A1 Text')
                            ,('A2 Text')
                            ,('ZZ' + ColA + ColB)
                            ,('ZZ' + ColC)
                            ,('ZZ' + ColE)
                    ) a(results)
    where a.results != 'ZZ'
    

    结果:

    results
    A1 Text
    A2 Text
    ZZ62501001
    ZZ12AA
    A1 Text
    A2 Text
    ZZ62501002
    ZZ12AA
    A1 Text
    A2 Text
    ZZ62511003
    ZZ12BB
    A1 Text
    A2 Text
    ZZ62521004
    ZZ12CC