首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >T-SQL查询枢轴

T-SQL查询枢轴
EN

Stack Overflow用户
提问于 2016-12-23 14:01:36
回答 3查看 65关注 0票数 1

我需要您的帮助,以便使用枢轴函数(MSSQL)进行MSSQL查询,我有3个表:

项目:

代码语言:javascript
代码运行次数:0
运行
复制
Id | Name
 1 | PE1XX 
 2 | PE2YZ

文件

代码语言:javascript
代码运行次数:0
运行
复制
Id | Name
 1 | ARM
 2 | LEX
 3 | FSP

控制

代码语言:javascript
代码运行次数:0
运行
复制
Id | IdProject  | IdFile| Result
 1 |     1      |   1   | 100
 2 |     1      |   2   | 50
 3 |     1      |   3   | 0 
 4 |     2      |   2   | 75

我想看到这样的数据..。

结果集

代码语言:javascript
代码运行次数:0
运行
复制
ProjectName | ARM   | LEX   | FSP   | ...* 
PE1XX       | 100   | 50    | 0     | ...
PE2YZ       | NULL  | 75    | NULL  | ... 

今天,我在代码中使用了多个foreach,但它的性能非常昂贵。

代码语言:javascript
代码运行次数:0
运行
复制
Foreach(p in Project){
  Foreach(f in File){
   var result = getFirstControl(p.IdProject, f.IdFile);
   ...
  }
}

我认为我们可以使用枢轴函数来更快地完成它,但是在我的例子中设置它有一些问题(文件列表可以修改).也许我能做得更容易?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-12-23 14:34:43

如果你需要动感

代码语言:javascript
代码运行次数:0
运行
复制
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);

返回

代码语言:javascript
代码运行次数:0
运行
复制
ProjectName ARM     FSP     LEX
PE1XX       100     0       50
PE2YZ       NULL    NULL    75
票数 1
EN

Stack Overflow用户

发布于 2016-12-23 14:24:57

谷歌如何使它成为一个动态的支点,但是如果你硬编码文件名的值,它看起来会像.

代码语言:javascript
代码运行次数: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
票数 0
EN

Stack Overflow用户

发布于 2016-12-23 14:40:09

代码语言:javascript
代码运行次数: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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41302858

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档