T-SQL 查询 PIVOT
T-SQL query PIVOT
我需要你的帮助来使用 PIVOT 函数进行 T-SQL 查询 (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);
...
}
}
我认为我们可以使用 pivot 函数来更快地完成它,但是我在设置它时遇到了一些问题(可以修改文件列表)......也许我可以更容易地做到这一点?
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
如果你需要动态化
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
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])
);
我需要你的帮助来使用 PIVOT 函数进行 T-SQL 查询 (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);
...
}
}
我认为我们可以使用 pivot 函数来更快地完成它,但是我在设置它时遇到了一些问题(可以修改文件列表)......也许我可以更容易地做到这一点?
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
如果你需要动态化
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
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])
);