2016-10-12 3 views
3

Ich habe temporäre Tabelle mit Daten.Konvertieren Sie zwei Spalten in 5 Zeilen in SQL-Server

select * 
from #test 

Verfahren dieser Ausgabe:

reg | Years 
--------------- 
6279 | 2016 
6641 | 2016 
8347 | 2016 
6228 | 2015 
8596 | 2015 
7596 | 2015 
6352 | 2015 
1245 | 2014 
5248 | 2014 
6359 | 2014 
6785 | 2014 
9578 | 2013 
4398 | 2013 
2986 | 2013 
7296 | 2013 

Aber der obigen Tabelle I in 5 Zeilen angezeigt werden müssen. Es bedeutet, unter

years | reg1 | reg2 | reg3 | reg4 
------+------+------+------+----- 
2016 | 6279 | 6641 | 8347 | NULL 
2015 | 6228 | 8596 | 7596 | 6352 
2014 | 1245 | 5248 | 6359 | 6785 
2013 | 9578 | 4398 | 2986 | 7296 

Spalten in Zeilen Beispiel konvertiert Ich habe versucht, mit Pivot und Entpivotisierung nach irgendeinem Vorschlag aber noch bin ich nicht bekommen. Bitte hilf mir.

Antwort

4

Hier ist ein dynamisch CROSS TAB Trick

DECLARE @sql  VARCHAR(max)='', 
     @intr  INT = 1, 
     @cnt  INT 

SELECT @cnt = (SELECT (Max([Years]) - Min([Years])) + 1 
        FROM Yourtable) 

SET @sql = 'select [Years], ' 

WHILE @intr <= @cnt 
    BEGIN 
     SET @sql += 'max(case when rn = '+ Cast(@intr AS VARCHAR(4)) + ' then [reg] end) as [reg' 
        + Cast(@intr AS VARCHAR (100)) + '],' 
     SET @intr+=1 
    END 

SET @sql = LEFT(@sql, Len(@sql) - 1) 

SELECT @sql += 'from (select row_number()over(partition by [Years] order by [reg]) as rn,* from Yourtable) a group by [Years]' 

--SELECT @sql 

EXEC(@sql) 
2

Für eine begrenzte Anzahl von Datensätzen pro Jahr Sie bedingte Aggregation in einer statischen SQL-Abfrage verwenden können:

;WITH temp_with_rn AS (
    SELECT eg, years, ROW_NUMBER() OVER (PARTITION BY Years ORDER BY eg) AS rn 
    FROM temp 
) 
SELECT years, 
     MAX(CASE WHEN rn = 1 THEN eg END) AS reg1, 
     MAX(CASE WHEN rn = 2 THEN eg END) AS reg2, 
     MAX(CASE WHEN rn = 3 THEN eg END) AS reg3, 
     MAX(CASE WHEN rn = 4 THEN eg END) AS reg4 
FROM temp_with_rn 
GROUP BY years 
+0

Ich habe einen Zweifel ... wir sind usin g Max() Funktion in Abfrage .... Wenn wir das Maximum verwenden, wird zuerst kommen .... aber ich brauche nicht .. bitte hilf mir ... in anderer Lösung –

1

Mit PIVOT Verwendung zu erreichen :

Select * from 
(Select *, 'reg' + cast(row_number() over(partition by year order by reg) as varchar(5)) RowVal 
from table) x 
PIVOT 
(
MAX(reg) FOR RowVal in ([reg1], [reg2], [reg3], [reg4]) 
) y 
order by year desc 
Verwandte Themen