2017-12-19 4 views
0

Ich brauche eine Hilfe, um gerade Zeilennummer Daten in die erste Spalte und ungerade Zeilennummer Daten in die zweite Spalte hinzuzufügen. Mit SQL Server 2008/SQL Server 2008 R2 ...Wie werden geradzahlige Zeilennummern in die erste Spalte und ungerade Zeilennummern in die zweite Spalte eingefügt?

Beispiel

id  Data 
1  TK104 
2  ABC 
3  TK106 
4  XYZ 

FOR OUTPUT suchen, wie

NAME   VALUE 
TK104   ABC 
TK106   XYZ 
+0

Keine Lücken ‚Lücken‘ enthalten kann, immer gerade Anzahl von Zeilen? Mach einen Self Join. – jarlh

Antwort

0

Ich bin nicht ganz sicher, ob Sie sich beziehen zu einer temporären Tabelle, aber wenn Sie das meinen:

CREATE TABLE #ReturnData (Column1 VARCHAR(50), Column2 VARCHAR(50)) 

INSERT INTO #ReturnData (Column1, Column2) (
    SELECT 
    CASE WHEN MyTable.ID % 2 = 0 THEN CONVERT(VARCHAR, whateverdata) ELSE '' END, 
    CASE WHEN MyTable.ID % 2 > 0 THEN CONVERT(VARCHAR, whateverdata) ELSE '' END 
    FROM MyTable 
) 


SELECT * FROM #ReturnData 
DROP TABLE #ReturnData 

Dies gibt Ihnen sogar in der ersten Spalte, ungerade in der Sekunde. Ein Beispiel aus einer Tabelle in einem unserer DBs:

(106 rows affected) 
Column1           Column2 
-------------------------------------------------- ------------------------ 
652             
                653 
654             
                655 
0

auf Ihrem Beispiel Basierend sieht es aus wie Sie Datensätze anschließen möchten, wo id = i mit Aufzeichnungen, wo id = i + 1. Wenn ja, sollten Sie sich selbst kommen in der Tabelle auf diesem Kriterium:

SELECT A.Data NAME, B.Data VALUE 
FROM Example A FULL JOIN Example B -- Self-join. Using a FULL join in case of gaps 
ON A.id + 1 = B.id 
AND B.id % 2 = 1 --Make sure that Value is odd 
AND A.id % 2 = 0 --Name is even 
+1

'... AND B.id% 2 = 1' (Um FULL OUTER JOIN beizubehalten.) – jarlh

+0

Das Problem @jarlh kommentierte wurde behoben. – zambonee

1

Wenn Ihre id Verwendung row_number() und bedingte Aggregation

select 
    max(case when rn % 2 = 0 then data end) as name, 
    max(case when rn % 2 = 1 then data end) as value 
from 
(
    select *, 
     row_number() over (order by id) as rn 
    from your_table 
) 
group by rn/2 
Verwandte Themen