2017-07-24 2 views
3

ich folgende Tabelle habengenerieren drei Reihen in Auswahlabfrage

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

Ergebnis Tabelle:

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

Danach schrieb ich eine Abfrage auf TableA die Ausgabe nach der Rückkehr

Abfrage:

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; 

Ergebnis:

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 

Und ich benötigt folgende Ausgabe:

Erforderliche Leistung:

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 

Antwort

1

ein paar common table expressions und row_number() zusammen mit den table value constructor (values (...),(...)) zu cross join Nummern 1, 2 und 3 dann ein left join mit Verwendung zurückzukehren 3 Zeilen pro TableCode, auch wenn Sie nicht über drei Zeilen in der Quelltabelle haben.

;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 Demo: http://rextester.com/CJU8986

kehrt:

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

Dies scheint zu tun, was Sie wollen:

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; 

Ich sehe keinen Grund Verwenden Sie row_number(), wenn Sie nur die richtigen Werte einlesen können. Außerdem ist VALUES ein SQL-Schlüsselwort, daher handelt es sich um einen wirklich schlechten Spaltennamen.

+0

dies ist mir nicht helfen, über Abfrage nicht mir die erforderliche Leistung zu bekommen, was über „ParaSource-1, ParaSource-2, ParaSource-3 " –