Sql 在select查询中生成三行

Sql 在select查询中生成三行,sql,sql-server-2008-r2,Sql,Sql Server 2008 R2,我有下表 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 +

我有下表

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

这似乎可以满足您的要求:

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;
如果您只需读取正确的值,我认为没有理由使用
行编号()。另外,
VALUES
是一个SQL关键字,因此它是一个非常糟糕的列名。

使用两个和以及 到
交叉连接
编号1、2和3,然后使用
左连接
每个
表返回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演示:

返回:

+-----------+---------+--------------+----------+-------+
| 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 |
+-----------+---------+--------------+----------+-------+

这对上面的查询没有帮助,无法获得所需的输出“ParaSource-1、ParaSource-2、ParaSource-3”呢