2016-05-27 22 views
-1

Ich habe eine Tabelle wie dieseSQL-Abfrage Zeilen in Spalten

CREATE TABLE #CurrencyRate 
(
    [Base] nvarchar(10), 
    [Quote] nvarchar(10), 
    [Amount] nvarchar(10) 
) 

und es hat Daten wie diese

Base Quote Amount 
--------------------- 
R1C1 R1C2 R1C3 
R2C1 R2C2 R2C3 

Hinweis: R1C1 => Zeile 1, Spalte 1

Ich möchte einen Ausgang wie

Row  Column Attribute Value 
----------------------------------------- 
1   1  Base  R1C1 
1   2  Quote  R1C2 
1   3  Amount  R1C3 
2   1  Quote  R2C1 
2   2  Amount  R2C2 
2   3  Base  R2C3 
ausgeben

Ist es möglich, mit so etwas SQL wie folgt ausgegeben werden?

Vielen Dank im Voraus

+1

Ja, es ist ein UNPIVOT genannt, und wenn man diesen Begriff google finden Sie viele Beispiele finden. –

+0

Sieht aus wie SQL Server ist es? Wenn ja, welche Ausgabe? und was bestimmt die "Reihenfolge" der Reihen? Basis, Quote dann Menge oder was? – xQbert

+0

Das Datum 'R1C1' ist nicht wörtlich 'R1C1', oder? – Sturgus

Antwort

1

Unpivot sein kann einfacher, aber Sie müssen auch irgendwie Ihre Zeilennummern und Spaltennummern erzeugen ... Ich tat dies einer Fenster-Funktion war aber unsicher über die Reihenfolge der Zeilen in Ihrem Tabelle.

Aber wenn Sie nur mit 3 Spalten arbeiten, sollte dies auch funktionieren.

WITH cte as (
SELECT row_number() 
    over (partition by base,quote,amount order by base, quote Amount) as RN, 
Base, Quote, Amount 
FROM #CurrencyRate) 

SELECT RN as Row, 1 as Column, 'Base', base as value FROM cte 
UNION ALL 
SELECT RN, 2, 'Quote', quote FROM cte 
UNION ALL 
SELECT RN, 3, 'Amount', Amount FROM cte 
1
select 
    Row, 
    row_number() over (partition by row order by Row) Col, 
    Value, 
    Attribute 
from (
    select Base, Quote, Amount, 
    row_number() over (order by Base) Row 
    from #CurrencyRate c 
) a 
unpivot 
(
    Value for Attribute in ([Base], [Quote], [Amount]) 
) unpvt;