2017-05-30 15 views
1

同じIDの行を取得して同じ行に戻そうとしています。SQL複数の行を1行にまとめる

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

そして私は、それは次のようになりたい:私のデータは以下のようになります

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

私は、クエリとしてこれを試してみましたが、私は多くの幸運を持っているように見えません:

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 

誰でもこの助けができますか?

ありがとうございます!

+0

【使い方の可能性のある重複SQL Serverで未知数の列と集約をピボットするには?](https://stackoverflow.com/questions/22772481/how-to-pivot-unknown-number-of-columns-no-aggregate-in-sql-server) ) –

答えて

0

あなたはrow_numberのようなウィンドウ関数の組み合わせを使用して、あなたがしたいという結果を得るためにMAX()CASE式を使用して、いくつかの条件付き集約することができます

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; 

Demoを参照してください。 row_number()関数は、それぞれidの一意の番号を作成し、CASEおよびMAXと共にこの番号を使用して、データ行を列に変換します。

+1

これはうまくいって、簡単に把握するのに十分なほど単純でした、ありがとう! – Samatag

0

あなたは以下のようにこれを行うには、ピボットを使用することができます果物の数が固定されていない場合は

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

を、あなたは、動的スクリプトを使用することができます。

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 
関連する問題