2016-12-05 5 views
0

если у меня есть таблица, как указано ниже.pivot в sql server 2012 с uniqeness

declare @mytble table 
(
orders int, 
product varchar (50), 
quantity int 

) 

INSERT @mytble 

SELECT 100,'CUP','1' UNION ALL 
SELECT 100, 'PLATE',2 UNION ALL 
SELECT 101,'CUP','1' UNION ALL 
SELECT 102,'CUP','2' UNION ALL 
SELECT 103, 'CUP',1 UNION ALL 
SELECT 103,'PLATE','3' UNION ALL 
SELECT 103,'GLASS','1' 

SELECT * FROM @mytble 

можно будет получить такой выход.

enter image description here

любое предложение, пожалуйста.

+0

http://meta.stackoverflow.com/questions/285551/why-may-i-not-upload -images-of-code-on-so-when-ask-a-question/285557 # 285557 –

+0

Да, это возможно. Но как это сделать, зависит от того, сколько у вас разных продуктов ... – DVT

ответ

0

С некоторым динамическим SQL и функции DENSE_RANK()

Declare @SQL varchar(max) 
Select @SQL = Stuff((Select Distinct ',' + QuoteName(concat('Product',Dense_Rank() over (Order By Product))) 
            + ',' + QuoteName(concat('Quantity',Dense_Rank() over (Order By Product))) 
         From myTable For XML Path('')),1,1,'') 

Select @SQL = 'Select Orders,' + @SQL + ' 
       From (
         Select Orders,Item=concat(''Product'',Dense_Rank() over (Order By Product)),Val=cast(Product as varchar(max)) From myTable 
         Union All 
         Select Orders,Item=concat(''Quantity'',Dense_Rank() over (Order By Product)),Val=cast(Quantity as varchar(max)) From myTable 
        ) A 
       Pivot (max(Val) For Item in (' + @SQL + ')) p' 

Exec(@SQL); 

возвратов

Orders Product1 Quantity1 Product2 Quantity2 Product3 Quantity3 
100  CUP   1   NULL  NULL  PLATE  2 
101  CUP   1   NULL  NULL  NULL  NULL 
102  CUP   2   NULL  NULL  NULL  NULL 
103  CUP   1   GLASS  1   PLATE  3