2017-07-10 14 views
0

SQLクエリ結果を作成したいと思います。在庫の場所が1つ以上あるため動的に作成したい(例.. CTE)SQL Server Pivotクエリを作成する方法は?

Item_id  Location Qty 
-------------------------- 
1    a  1  
2    b  2 
3    c  3 
3    a  1 
2    c  2 
1    b  3 

結果は....

Item_id a_Location_Qty b_Location_Qty c_Location_Qty 
------------------------------------------------------- 
1   1    3    0 
2   0    2    2 
3   1    0    3 
+5

は、私たちは、問題を分析し、あなたを支援するために、あなたのSQLクエリのコードを提供します。ありがとう! –

+4

Google:SQL Serverのピボット –

+0

それ以上のものはありますか?メッセージが短すぎます。 – DeiMo

答えて

0

Create Table #Stack10072017040904(Item_id varchar(100),Location varchar(100),Qty int) 
insert into #Stack10072017040904 select '1','a','1' 
insert into #Stack10072017040904 select '2','b','2' 
insert into #Stack10072017040904 select '3','c','3' 
insert into #Stack10072017040904 select '3','a','1' 
insert into #Stack10072017040904 select '2','c','2' 
insert into #Stack10072017040904 select '1','b','3' 
select Item_id,Isnull(a,0) a_Location_Qty 
,isnull(b,0)b_Location_Qty 
,isnull(c,0)c_Location_Qty 
from #Stack10072017040904 
pivot 
(Sum(Qty) for Location in ([a],[b],c))pvt 
drop table #Stack10072017040904 
+0

在庫場所が3つ以上の場合は、SQL文を編集または追加しますか? – MayHnin

0

この動的SQLを試してみてくださいコードの下に試してみてください

Declare 
     @Sql nvarchar(max), 
     @dynamicCol nvarchar(max), 
     @dynamicCol2 nvarchar(max) 
--Create columns Dynamically 
SELECT @dynamicCol=STUFF((SELECT DISTINCT ', '+ QUOTENAME(Location) 
From #Stack10072017040904 For XML PATH ('')),1,1,'') 

SELECT @dynamicCol2=STUFF((SELECT DISTINCT ', '+ 'ISNULL ('+ QUOTENAME(Location)+ ','+'''0'''+')' +' AS '+Location+'_Location_Qty' 
From #Stack10072017040904 For XML PATH ('')),1,1,'') 

SET @Sql=' 
SELECT [Item_id] ,'+ @dynamicCol2 +' From 
(
SELECT * From 
#Stack10072017040904 
)AS Src 
PIVOT 
(
MAX([Qty]) For [Location] IN ('[email protected]+') 
) 
AS Pvt' 

PRINT @Sql 

EXEC(@Sql) 

結果

Item_id a_Location_Qty b_Location_Qty c_Location_Qty 
------------------------------------------------------- 
1   1    3    0 
2   0    2    2 
3   1    0    3 
0

動的に列を構築し、ダイナミックPIVOTを使用します。

Create Table #Test(Item_id varchar(100),Location varchar(100),Qty int) 
insert into #Test values('1','a','1') 
insert into #Test values('2','b','2') 
insert into #Test values('3','c','3') 
insert into #Test values('3','a','1') 
insert into #Test values('2','c','2') 
insert into #Test values('1','b','3') 

DECLARE @cols1 AS NVARCHAR(MAX), @cols2 AS NVARCHAR(MAX), @query AS NVARCHAR(MAX); 

SET @cols1 = STUFF((SELECT distinct ', isnull(' + quotename(s.Location) + ', 0) as ' + quotename(s.Location) 
      FROM #Test s 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

SET @cols2 = STUFF((SELECT distinct ',' + quotename(s.Location) 
      FROM #Test s 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Item_id, ' + @cols1 + ' from 
      (
       select Item_id 
        , Location 
        , Qty 
       from #Test 
      ) x 
      pivot 
      (
       max(qty) 
       for Location in (' + @cols2 + ') 
      ) p ' 

execute(@query) 

drop table #Test 
関連する問題