2017-11-23 5 views
2

Ich habe Problem mit vier Reihen kombinieren (value3 = rowNumber) in eine ReiheSQL Server: die Kombination von Zeilen

Ich habe so etwas wie die:

id value1 value2 value3 
A1 11  21  1 
A2 12  22  2 
A3 13  23  3 
A4 14  24  4 

Und ich brauche etwas wie die

id value1 value2 id value1 value2 id value1 value2 id value1 value2 
A1 11  21 A2  12  22 A3 13  23 A4 14  24 

Könnte mir bitte jemand dabei helfen?

+0

Können Sie bitte hinzufügen Was hast du bisher versucht? –

+0

Warum willst du das machen? Dieser Ansatz wird sehr schnell sehr hässlich, wenn sich die Anzahl der Zeilen erhöht. Wahrscheinlich besser, um es in Ihrer Präsentationsebene zu handhaben. –

+0

Mögliches Duplikat von [Zeilen effizient in Spalten in SQL Server konvertieren] (https://stackoverflow.com/questions/15745042/efficiently-convert-rows-to-columns-in-sql-server) – Patrick

Antwort

0

Try this,

CREATE TABLE #Table(Id varchar(5), value1 int, Value2 int,value3 int) 
INSERT INTO #Table VALUES('A1',11,21,1) 
INSERT INTO #Table VALUES('A2',12,22,2) 
INSERT INTO #Table VALUES('A3',13,23,3) 
INSERT INTO #Table VALUES('A4',14,24,4) 


SELECT T1.Id,T1.value1,T1.Value2,T2.Id,T2.value1,T2.Value2,T3.Id,T3.value1,T3.Value2,T4.Id,T4.value1,T4.Value2 
FROM #Table T1 
INNER JOIN #Table T2 ON T1.value3=T2.value3-1 
INNER JOIN #Table T3 ON T1.value3=T3.value3-2 
INNER JOIN #Table T4 ON T1.value3=T4.value3-3 

Hope this Ihnen hilft.

0

Dieser ist sehr hässlich, aber man könnte versuchen, bedingte case Aggregation

SELECT MAX(CASE(ID) WHEN 'A1' THEN ID ELSE NULL END) [A1], 
     MAX(CASE(ID) WHEN 'A1' THEN value1 ELSE NULL END) [value1], 
     MIN(CASE(ID) WHEN 'A1' THEN value2 ELSE NULL END) [value2], 
     .. 
     .. 
     MAX(CASE(ID) WHEN 'A4' THEN ID ELSE NULL END) [A4], 
     MAX(CASE(ID) WHEN 'A4' THEN value1 ELSE NULL END) [value1], 
     MIN(CASE(ID) WHEN 'A4' THEN value2 ELSE NULL END) [value2] 

     FROM <table> 

Ergebnis:

id value1 value2 id value1 value2 id value1 value2 id value1 value2 
A1 11  21 A2  12  22 A3 13  23 A4 14  24 
0

diesen Code Versuchen Sie, für die beste Lösung,

    DECLARE @table TABLE(ID VARCHAR(50),value1 VARCHAR(50),value2 VARCHAR(50),value3 VARCHAR(50)) 


     INSERT INTO @table (ID, value1, value2, value3) 
     SELECT 'A1',11,21,1 
     UNION 
     SELECT 'A2',12,22,2 
     UNION 
     SELECT 'A3',13,23,3 
     UNION 
     SELECT 'A4',14,24,4 





     SELECT Val, pvtCol INTO #table FROM(
     SELECT *,col+'_'+CONVERT(VARCHAR(50),ROW_NUMBER() OVER(ORDER BY (SELECT 1))) pvtCol FROM 
     @table tbl 
     UNPIVOT 
     (val FOR col IN (ID,value1,value2)) 
     unPvt 
     )x 

     DECLARE @PvtCol NVARCHAR(MAX) = STUFF((SELECT ',[' + pvtCol,']' FROM #table FOR XML PATH('')),1,1,'') 
     DECLARE @PvtColDisplay NVARCHAR(MAX) = STUFF((SELECT ',[' + pvtCol,'] AS [' + LEFT(pvtCol,CHARINDEX('_',pvtCol)-1),']' FROM #table FOR XML PATH('')),1,1,'') 

     EXEC ('SELECT '[email protected]+' FROM #table rdyPvt 
     PIVOT 
     (
     MAX(Val) FOR pvtCol IN ('[email protected]l+') 
     ) pvt') 



     DROP TABLE #table