我需要你的帮助才能使用PIVOT函数(MSSQL)进行T-SQL查询 我有3张桌子:
项目:
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在我的代码中生成了结果,但它的性能很昂贵。
Foreach(p in Project){
Foreach(f in File){
var result = getFirstControl(p.IdProject, f.IdFile);
...
}
}
我认为我们可以使用枢轴功能来更快地完成它但我在我的情况下设置它有一些问题(文件列表可以修改)......也许我可以更容易地做到这一点?
答案 0 :(得分: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
答案 1 :(得分:0)
谷歌如何将其作为动态支点,但如果您要对文件名的值进行硬编码,它看起来会像......
;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
答案 2 :(得分: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])
);