【问题标题】:How to create Sql Server 2008 Cross Tab Dynamic Query?如何创建 Sql Server 2008 跨表动态查询?
【发布时间】:2012-11-14 23:39:52
【问题描述】:

我有 3 张桌子:

  • 地点LocationID, LocationName
  • 缺陷DefectID, DefectType
  • 反馈feedbackID, DefectID, LocationID

我需要以下格式的交叉表报告:位置列下方的数字是该位置的缺陷总数。位置可以是任意数字。它应该是动态的..

DefectID  DefectType  NewYork  NewJersey  Texas  Houston
1         Defect1       0         10        3       6
2         Defect2       0          0        9      10
3         Defect3       8          8        4       6

我有一个硬编码的 SQL 查询。此外,它没有显示DefectID..

select 
   DefectType, 
   [1] as NewYork, 
   [4] as NewJersy,  
   [5] as Texas, 
   [6] as Houston
from (select 
             Defect.DefectID, 
             Defect.DefectType, 
             Location.LocationID  
      from Feedback
      inner join Locations on (Feedback.LocationID= Location.LocationID)             
      inner join DefectType on (Feedback.DefectID= Defect.DefectID)         
     ) p
    pivot   
     ( count (DefectID) for LocationID in ( [1], [4], [5],[6] )   ) as pvt
 order by pvt.DefectType; 

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    您不能使用 SQL Server PIVOT 和纯静态 SQL 动态构建交叉表值。您必须动态构建 SQL,或者使用一些外部脚本语言构建查询,或者使用 T-SQL 使用 execute

    DECLARE @locationID int, @LocationName nvarchar(50), 
      @columnList nvarchar(max), @idList nvarchar(max), @sql nvarchar(max) ;
    DECLARE location_cursor CURSOR
        FOR SELECT locationID, LocationName FROM Locations
    
    SET @columnList = '';
    SET @idList = '';
    
    
    OPEN location_cursor
    FETCH NEXT FROM vendor_cursor 
    INTO @locationID, @LocationName;
    WHILE @@FETCH_STATUS = 0
    BEGIN
      SET @columnList = @columnList + ', [' + @locationID + '] as [' + @locationName + ']'
      SET @idList = @idList + '[' + @locationID + '],'
    END
    CLOSE location_cursor
    
    SET @sql = 'select DefectType' + @columnList + ' from (select Defect.DefectID, Defect.DefectType, Location.LocationID from Feedback inner join Locations on (Feedback.LocationID= Location.LocationID)
    inner join DefectType on (Feedback.DefectID= Defect.DefectID)
    ) p pivot
    ( count (DefectID) for LocationID in (' + left(@idList,len(@idList)-1) + ') ) as pvt order by pvt.DefectType'
    
    EXECUTE (@sql)
    

    显然,我还没有对此进行测试,但它应该可以工作(可能需要稍作调整)。

    【讨论】:

      猜你喜欢
      • 2011-12-18
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2013-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多