2012-01-31 54 views
2

我有3個表:如何創建Sql Server 2008交叉表動態查詢?

  • 位置LocationID, LocationName
  • 缺陷DefectID, DefectType
  • 反饋feedbackID, DefectID, LocationID

我需要在以下格式交叉表報告:地點欄下面的數字是防守總數cts爲該位置。位置可以是任何數字。它應該是動態的..

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; 

回答

2

你不能動態地建立與SQL Server PIVOT和純靜態SQL的交叉表值。你必須動態地生成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) 

我沒有測試過這一點,很明顯,但它應該工作的T-SQL(有小的調整可能需要)。