2017-06-08 6 views
0

dies ist mein erstes Mal versucht, eine Dreh zu tun, sondern auch mit allen Informationen online zu implementieren, sie ist immer noch unbrauchbar :(Ich versuche Pivot SQL

ich diese Tabelle habe.

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

und diese Tabelle

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

ich meine Ausgabe wie folgt

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

Kann mir bitte jemand helfen?

+0

Was die „-Eingang ist "Für Ihre Anfrage? Z.B. Versuchen Sie, dies für alle Ihre Daten zu tun, oder erhalten Sie z. eine bestimmte ChecklistItemID oder eine Liste von 'ID's usw. Gibt es auch eine Begrenzung für die Anzahl der beteiligten Dateien? –

+0

Ich denke, Ihre Beispieldaten haben ein Problem. 'ChecklistItemID'' 12' ist nur mit einem der beiden Anhänge verbunden. –

+0

oops sorry, ich habe es bearbeitet. –

Antwort

0

Dies scheint den Trick zu tun. Ich habe es ganz offen gelassen, weil Sie nicht gesagt haben, ob Sie das für alle Ihre Daten oder nur für eine bestimmte Checkliste tun.

Der Trick war eine ROW_NUMBER() zu verwenden, um bekannte Namen für die File Spalten zu erhalten:

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 

Ergebnis:

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