2017-07-24 105 views
3

我有以下表表生成select查询三行

SELECT TableCode, Col1, Col2 
FROM TableA 
WHERE TableCode = 23 

结果:

TableCode | Col1 | Col1 
23   | CustCode | QS 
23   | CatCode | QS 

之后,我TableA上写一个查询其返回下面的输出

查询:

SELECT TableCode,x.ColCode, 
     x.ColumnName + '_' + CONVERT(VARCHAR(5), ROW_NUMBER() OVER (PARTITION BY X.COL ORDER BY X.COL)) [ColumnName],X.Values, 
     ROW_NUMBER() OVER (PARTITION BY X.COL ORDER BY X.COL) [RowNo] 
FROM TableA a CROSS APPLY 
    (SELECT 1 ColCode,'ParaName' ColumnName,Col1 Values 
     UNION ALL 
     SELECT 2,'ParaSource',Col2 
    ) x 
WHERE TableCode = 23; 

结果:

TableCode | ColCode | ColumnName | Values | RowNo 
23  | 1  | ParaName_1 | CustCode | 1 
23  | 1  | ParaName_2 | CatCode | 2 
23  |  2 | ParaSource_1 | QS  | 1 
23  | 2 | ParaSource_2 | QS  | 2 

而且我需要进行以下的输出:

所需的输出:

TableCode | ColCode | ColumnName | Values | RowNo 
23  | 1  | ParaName_1 | CustCode | 1 
23  | 1  | ParaName_2 | CatCode | 2 
23  | 1  | ParaName_3 | Null | 3 
23  |  2 | ParaSource_1 | QS  | 1 
23  | 2 | ParaSource_2 | QS  | 2 
23  | 2 | ParaSource_3 | null | 3 

回答

1

使用一对夫妇的common table expressionsrow_number()table value constructor (values (...),(...))cross join号1,2沿和3,然后用left join返回每TableCode 3行,即使你没有在源表中三行。

;with numbered as (
    select *, rn = row_number() over (order by (select 1)) 
    from TableA 
    where TableCode = 23 
) 
, cte as (
    select distinct tc.TableCode, a.Col1, a.Col2, v.rn 
    from numbered tc 
    cross join (values (1),(2),(3)) v (rn) 
    left join numbered a 
     on a.TableCode = tc.TableCode 
    and a.rn = v.rn 
) 
select 
    a.TableCode 
    , x.ColCode 
    , [ColumnName] = x.ColumnName + '_' + convert(varchar(5),a.rn) 
    , X.Value 
    ,[RowNo] = a.rn 
from cte a 
    cross apply (values (1,'ParaName',Col1),(2,'ParaSource',Col2)) 
    as x(ColCode, ColumnName, Value) 
order by ColCode, RowNo; 

rextester演示:http://rextester.com/CJU8986

回报:

+-----------+---------+--------------+----------+-------+ 
| TableCode | ColCode | ColumnName | Value | RowNo | 
+-----------+---------+--------------+----------+-------+ 
|  23 |  1 | ParaName_1 | CustCode |  1 | 
|  23 |  1 | ParaName_2 | CatCode |  2 | 
|  23 |  1 | ParaName_3 | NULL  |  3 | 
|  23 |  2 | ParaSource_1 | QS  |  1 | 
|  23 |  2 | ParaSource_2 | QS  |  2 | 
|  23 |  2 | ParaSource_3 | NULL  |  3 | 
+-----------+---------+--------------+----------+-------+ 
0

这似乎做你想要的:

SELECT TableCode, x.ColCode, v.* 
FROM TableA a CROSS APPLY 
    (VALUES (1, 'ParaName-1', Col1, 1), 
      (2, 'ParaName-2', Col2, 2), 
      (3, 'ParaName-3', NULL, 2) 
    ) v(ColCode, ColumnName, [Values], RowNo) 
WHERE TableCode = 23; 

我看不出有任何理由使用row_number()时,你可以在正确的价值观只是阅读。此外,VALUES是一个SQL关键字所以它是一个非常糟糕的列名。

+0

这不是帮我上面的查询没有得到我所需要的输出怎么样“ParaSource-1,ParaSource-2,ParaSource-3 “ –