2017-09-21 4 views
0

SQLサーバーに新しい列としてすべての10行を選択し、示すように、私はデータをSQLテーブルを持っている

Item  Qty 
------------ 
A1  59 
A2  76 
A3  86 
A1  12 
A2  17 
A3  15 
A1  23 
A2  39 
A3  07 

ここでは、項目がrepeated.Soで見ることができ、私はアイテム別グループレコードをしたいと思います。 私は出力テーブルがランキング機能ROW_NUMBERで使用pivot

Item Qty1  Qty2  qty3 
---------------------------------- 
    A1  59  12  23 
    A2  76  17  39 
    A3  86  15  07 
+1

いつも3つのQTYがありますか? –

+0

なぜ59が 'Qty1'で、' Qty3'でないのですか? –

答えて

1

あなたは以下のようにピボットを使用することができます。

Select * from (
    Select *, Qtys = Concat('Qty', Row_Number() over(partition by Item order by Item)) 
     from #itemdata 
     ) a 
    pivot (max(qty) for qtys in ([Qty1],[Qty2],[Qty3])) p 

動的リストの場合、次のようにクエリできます。

Declare @cols1 varchar(max) 
Declare @query nvarchar(max) 

Select @cols1 = stuff((select top (select max(cnt) from (select count(*) cnt from #itemdata group by item) a) ','+ 
    QuoteName(Concat('Qty', Row_Number() over(order by (select Null)))) from 
    master..spt_values c1, master..spt_values c2 for xml path('')),1,1,'') 

Select @query = ' Select * from (
    Select *, Qtys = Concat(''Qty'', Row_Number() over(partition by Item order by Item)) 
      from #itemdata 
     ) a 
    pivot (max(qty) for qtys in (' + @cols1 + ')) p ' 

Exec sp_executesql @query 
2

以下のように見える取得したい:

WITH CTE 
AS 
(

    SELECT 
     Item, QTy, ROW_NUMBER() OVER(PARTITION BY ITem ORDER BY Item) AS RN 
    FROM tablename 

) 
SELECT Item, [1] AS Qty1, [2] AS Qty2, [3] AS Qty3 
FROM CTE 
PIVOT 
(
    SUM(Qty) 
    FOR rn IN([1], [2], [3]) 
) AS p; 

結果:

| Item | Qty1 | Qty2 | Qty3 | 
|------|------|------|------| 
| A1 | 59 | 12 | 23 | 
| A2 | 39 | 17 | 76 | 
| A3 | 86 | 15 | 7 | 

これらの量が固定されていないと、彼らは常に3ではありませんしている場合は、動的にこのようにそれを実行する必要があります。

DECLARE @cols AS NVARCHAR(MAX); 
DECLARE @query AS NVARCHAR(MAX); 
DECLARE @colNames AS NVARCHAR(MaX); 


select @cols = STUFF((SELECT distinct ',' + 
       QUOTENAME(CAST(RN AS NVARCHAR(10))) 
         FROM 
         (
         SELECT 
     Item, QTy, ROW_NUMBER() OVER(PARTITION BY ITem ORDER BY Item) AS RN 
    FROM tablename) as t 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 

select @colNames = STUFF((SELECT distinct ',' + 
       '[' + CAST(RN AS NVARCHAR(10)) + '] AS Qty' + 
         CAST(RN AS NVARCHAR(10)) 
         FROM 
         (
         SELECT 
     Item, QTy, ROW_NUMBER() OVER(PARTITION BY ITem ORDER BY Item) AS RN 
    FROM tablename) as t 
         FOR XML PATH(''), TYPE 
        ).value('.', 'NVARCHAR(MAX)') 
         , 1, 1, ''); 


SELECT @query = 'WITH CTE 
AS 
(

    SELECT 
     Item, QTy, ROW_NUMBER() OVER(PARTITION BY ITem ORDER BY Item) AS RN 
    FROM tablename 

) 
SELECT Item,' + @colNames + ' 
FROM CTE 
PIVOT 
(
    SUM(Qty) 
    FOR rn IN(' + @cols + ') 
) AS p;'; 

execute(@query); 

demo

関連する問題