【问题标题】:T-SQL query PIVOTT-SQL 查询 PIVOT
【发布时间】:2016-12-23 14:01:36
【问题描述】:

我需要您的帮助来使用 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);
   ...
  }
}

我认为我们可以使用数据透视函数更快地完成它,但我在设置它时遇到了一些问题(文件列表可以修改)......也许我可以更轻松地做到这一点?

【问题讨论】:

    标签: sql-server pivot pivot-table


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      ;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
      

      【讨论】:

        【解决方案3】:
        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])
        );
        

        【讨论】:

        • 请不要忘记解释/评论您的代码,并提供相关文档[来自评论]
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-29
        • 1970-01-01
        • 1970-01-01
        • 2015-12-06
        • 1970-01-01
        • 2012-05-11
        相关资源
        最近更新 更多