2017-06-08 2 views
0

c'est la première fois en essayant de faire un pivot mais même avec toutes les informations en ligne, je suis toujours inutile :(Je suis en train de mettre en œuvre Pivot SQL

Je cette table.

+-----+-----------------+------------+ 
| ID | ChecklistItemID | Attachment | 
| 327 | 912    | 611  | 
| 328 | 912    | 612  | 
+-----+-----------------+------------+ 

et ce tableau

+-----+----------+ 
| ID | FileName | 
| 611 | 2.jpg | 
| 612 | 3.jpg | 
+-----+----------+ 

Je veux que ma sortie soit comme celui-ci

+-----------------+-------+-------+ 
| ChecklistItemID | File1 | File2 | 
| 912    | 2.jpg | 3.jpg | 
+-----------------+-------+-------+ 

Quelqu'un peut-il vous aider s'il vous plaît?

+0

Quelle est la « entrée "pour votre requête? Par exemple. essayez-vous de le faire pour l'ensemble de vos données ou avez-vous reçu par exemple un ChecklistItemID spécifique ou une liste de 'ID's, etc. En outre, y a-t-il une limite au nombre de fichiers pouvant être impliqués? –

+0

Je pense que vos données d'échantillon ont un problème. 'ChecklistItemID'' 12' est uniquement connecté à l'une des deux pièces jointes. –

+0

oups désolé, je l'ai édité. –

Répondre

0

Cela semble faire l'affaire. Je l'ai laissé très ouvert puisque vous n'avez pas dit si vous le faites pour toutes vos données ou juste une liste de contrôle spécifique.

L'astuce était d'utiliser un ROW_NUMBER() pour obtenir des noms connus pour les File colonnes:

declare @t1 table (ID int not null,ChecklistItemID int not null,Attachment int not null) 
insert into @t1(ID,ChecklistItemID,Attachment) values 
(327,912,611), 
(328,912,612) 

declare @t2 table (ID int not null, FileName varchar(9) not null) 
insert into @t2(ID,FileName) values 
(611,'2.jpg'), 
(612,'3.jpg') 

;With Ordered as (
    select 
     t1.ChecklistItemID, 
     FileName, 
     'File' + CONVERT(varchar(5),ROW_NUMBER() OVER (PARTITION BY t1.ChecklistItemID 
            ORDER BY t2.ID)) as FileTitle 
    from 
     @t1 t1 
      inner join 
     @t2 t2 
      on 
       t1.Attachment = t2.ID 
) 
select 
    * 
from 
    Ordered 
     pivot (MIN(FileName) for FileTitle in (File1,File2,File3)) u 

Résultat:

ChecklistItemID File1  File2  File3 
--------------- --------- --------- --------- 
912    2.jpg  3.jpg  NULL 
0
IF OBJECT_ID('Tempdb..#Temp') IS NOT NULL 
Drop table #Temp 

Declare @Tab1 TABLE (ID INT, ChecklistItemID INT , Attachment INT) 
Insert into @Tab1 
SELECT 327 , 912, 611 UNION ALL   
SELECT 328 , 912, 612   

Declare @Tab2 TABLE (ID INT,FileName Varchar(10)) 
INSERT INTO @Tab2 
SELECT 611 , '2.jpg' Union all 
SELECT 612 , '3.jpg'  

SELECT ChecklistItemID,[FileName] INTO #Temp FROM @Tab1 t1 
INNER JOIN @Tab2 t2 
ON t1.Attachment=t2.ID 


DECLARE @COulmn nvarchar(max), 
     @query nvarchar(max) 
SELECT @COulmn= STUFF((SELECT ', '+'File'+CAST(ROW_NUMBER()OVER(PARTITION BY ChecklistItemID ORDER BY ChecklistItemID) AS Varchar(5)) 
FROM #Temp For XML PATH ('')),1,1,'') 


SET @query = N'SELECT ChecklistItemID,' + @COulmn + N' from 
      (
       SELECT *,''File''+ CAST(ROW_NUMBER()OVER(PARTITION BY ChecklistItemID ORDER BY ChecklistItemID) AS Varchar(5)) As FileColumn 
       FROM #Temp 
      ) Src 
      PIVOT 
      (
       MAX([FileName]) 
       FOR FileColumn in (' + @COulmn + N') 
      ) pvt ' 

EXEC sp_executesql @query; 

OutPut

ChecklistItemID File1 File2 
----------------------------- 
912    2.jpg 3.jpg