2016-12-23 5 views
1

мне нужна ваша помощь, чтобы сделали T-SQL-запрос с функцией PIVOT (MSSQL) У меня есть 3 таблицы:T-SQL PIVOT запрос

Проект:

Id | Name 
1 | PE1XX 
2 | PE2YZ 

Файл

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

управления

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

Я хочу, чтобы мои данные, как это ..

Результат Набор

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

Сегодня я сделал результат в моем коде с несколькими Еогеасп, но это дорого в производительности ,

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

Я думаю, что мы можем использовать функцию поворота, чтобы сделать это быстрее, но у меня есть некоторые проблемы, чтобы установить его в моем случае (список файлов может быть изменен) ... А может быть, я могу сделать это более легко ?

ответ

1

Если вам нужно идти динамический

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); 

Возвращает

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

Google, как вы сделали бы это динамический стержень, но если бы вы были жестко закодировать значения для имен файлов он будет выглядеть примерно так .....

;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

Пожалуйста, не забудьте объяснить/комментировать ваш код и предоставить соответствующую документацию [из обзора] – Blag