2017-05-30 8 views
1

Ich versuche, Zeilen mit der gleichen ID und geben Sie sie in der gleichen Zeile. Meine Daten sieht wie folgt:SQL kombinieren mehrere Zeilen in 1 Zeile

ID Fruit 
1 Banana 
1 Apple 
1 Grapefruit 
2 Cherry 
2 Blueberry 
3 Lime 
3 Pear 

Und ich würde es so aussehen mag:

ID Fruit Fruit1 Fruit2 
1 Banana Apple Grapefruit 
2 Cherry Blueberry NULL 

ich dies als eine Abfrage versucht, aber ich scheine nicht zu haben viel Glück :

SELECT a.[ID],a.[Fruit],b.[Fruit] 
FROM [test].[dbo].[Fruit] a 
JOIN [test].[dbo].[Fruit] b 
ON a.ID = b.ID 
WHERE a.FRUIT <> b.FRUIT 

Kann mit diesem jemand helfen?

Danke!

+0

Mögliche Duplikat [How um eine unbekannte Anzahl von Spalten und kein Aggregat in SQL Server zu schwenken?] (https://stackoverflow.com/questions/22772481/how-to-pivot-unknown-number-of-columns-no-aggregate-in-sql-server) –

Antwort

0

Sie können Kombination aus einer Fensterfunktion wie row_number verwenden und dann einige bedingte Aggregation einen CASE Ausdruck mit MAX() mit dem Ergebnis zu erhalten, die Sie mögen:

select 
    Id, 
    Fruit = max(case when rn = 1 then Fruit end), 
    Fruit1 = max(case when rn = 2 then Fruit end), 
    Fruit2 = max(case when rn = 3 then Fruit end) 
from 
(
    select 
    Id, 
    Fruit, 
    rn = row_number() over(partition by Id order by Id) 
    from [test].[dbo].[Fruit] 
) d 
group by Id; 

ein Demo See. Die row_number() Funktion erstellt eine eindeutige Nummer für jede id, dann mit dieser Nummer zusammen mit CASE und MAX werden Sie Ihre Zeilen von Daten in Spalten konvertieren.

+1

Das funktionierte gut und war einfach genug für mich, um leicht zu erfassen , Vielen Dank! – Samatag

0

können Sie schwenken verwenden diese, wie unten zu tun:

Select Id, [0] as Fruit, [1] as [Fruit1], [2] as [Fruit2] from (
    Select *, RowN = Row_Number() over (partition by Id order by Fruit) - 1 from yourtable) 
pivot (max(Fruit) for RowN in ([0], [1],[2])) p 
1

Wenn die Fruchtzahl nicht festgelegt ist, können Sie dynamische Skript verwenden:

IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
CREATE TABLE #t(ID INT,Fruit VARCHAR(100)) 
INSERT INTO #t(ID,Fruit) 
SELECT 1,'Banana' UNION 
SELECT 1,'Apple' UNION 
SELECT 1,'Grapefruit' UNION 
SELECT 2,'Cherry' UNION 
SELECT 2,'Blueberry' UNION 
SELECT 3,'Lime' UNION 
SELECT 3,'Pear' 
DECLARE @sql NVARCHAR(max),@cols VARCHAR(max) 
SELECT @cols=ISNULL(@cols+',','')+t.col FROM (
    SELECT *,'Fruit'+LTRIM(ROW_NUMBER()OVER(PARTITION BY ID ORDER BY(SELECT 1))) AS col FROM #t AS t 
) AS t GROUP BY t.col 




SET @sql=' 
SELECT * FROM (
    SELECT *,''Fruit''+LTRIM(ROW_NUMBER()OVER(PARTITION BY ID ORDER BY(SELECT 1))) AS col FROM #t AS t 
) AS t PIVOT(MAX(Fruit) FOR col in ('[email protected]+')) p 
' 
PRINT @sql 
EXEC(@sql) 
IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t 
 
ID   Fruit1  Fruit2  Fruit3 
----------- ---------- ---------- ---------- 
1   Apple  Banana  Grapefruit 
2   Blueberry Cherry  NULL 
3   Lime  Pear  NULL 
Verwandte Themen