我需要您的帮助,以便使用枢轴函数(MSSQL)进行MSSQL查询,我有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);
...
}
}
我认为我们可以使用枢轴函数来更快地完成它,但是在我的例子中设置它有一些问题(文件列表可以修改).也许我能做得更容易?
发布于 2016-12-23 06:34:43
如果你需要动感
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
发布于 2016-12-23 06:24:57
谷歌如何使它成为一个动态的支点,但是如果你硬编码文件名的值,它看起来会像.
;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
发布于 2016-12-23 06:40:09
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])
);
https://stackoverflow.com/questions/41302858
复制相似问题