2016-12-23 3 views
1

Ich brauche Ihre Hilfe eine T-SQL-Abfrage mit Pivot-Funktion (MSSQL) Ich habe 3 Tabellen gemacht:T-SQL-Abfrage PIVOT

Projekt:

Id | Name 
1 | PE1XX 
2 | PE2YZ 

Datei

Id | Name 
1 | ARM 
2 | LEX 
3 | FSP 

Steuerung

Id | IdProject | IdFile| Result 
1 |  1  | 1 | 100 
2 |  1  | 2 | 50 
3 |  1  | 3 | 0 
4 |  2  | 2 | 75 

Ich möchte, dass meine Daten so sehen ..

Ergbnisssatzes

ProjectName | ARM | LEX | FSP | ...* 
PE1XX  | 100 | 50 | 0  | ... 
PE2YZ  | NULL | 75 | NULL | ... 

Heute habe ich das Ergebnis in meinem Code mit mehreren foreach, aber es ist teuer in der Leistung .

Foreach(p in Project){ 
    Foreach(f in File){ 
    var result = getFirstControl(p.IdProject, f.IdFile); 
    ... 
    } 
} 

Ich denke, wir Pivot-Funktion verwenden können, es schneller zu tun, aber ich habe einige Probleme, die es in meinem Fall einzurichten (die Liste der Datei kann geändert werden) ... Und vielleicht kann ich es leicht tun ?

Antwort

1

Wenn Sie dynamische gehen müssen

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName([Name]) From [File] Order by 1 For XML Path('')),1,1,'') 
Select @SQL = ' 
Select [ProjectName],' + @SQL + ' 
From (
     Select ProjectName = P.[Name] 
       ,Item   = F.[Name] 
       ,Value  = C.[Result] 
     From [Control] C 
     Join [Project] P on C.IDProject = P.ID 
     Join [File] F on C.IDFile = F.ID 
     ) A 
Pivot (max(Value) For [Item] in (' + @SQL + ')) p' 
Exec(@SQL); 

Returns

ProjectName ARM  FSP  LEX 
PE1XX  100  0  50 
PE2YZ  NULL NULL 75 
0

Google, wie Sie würde dies eine dynamische Dreh machen, aber wenn Sie die Werte für die Dateinamen zu hart Code wäre, würde es in etwa so aussehen .....

;WITH X AS (
Select f.Name [FileName] 
     ,p.Name ProjectName 
     ,C.Result 
FROM [Control] C 
LEFT JOIN [File] F ON c.IdFile = F.Id 
LEFT JOIN [Project] P ON p.Id = c.IdProject 
) 
SELECT ProjectName , ARM , LEX , FSP 
FROM X 
PIVOT (SUM(Result) 
     FOR [FileName] 
     IN (ARM,LEX,FSP) 
     )p 
0
select * from 
(
    select p.name pname, 
    f.name fname, 
    c.result 
    from control c 
    inner join project p 
    on c.idproject = p.id 
    inner join files f 
    on c.idfile = f.id 
) t 
PIVOT 
(
    sum(result) over fname in 
    ([ARM], [LEX], [FSP]) 
); 
+0

Bitte vergessen Sie nicht, Ihren Code zu erklären/kommentieren und relevante Dokumentation zur Verfügung zu stellen. – Blag