Как создать динамический запрос кросс-таблицы Sql Server 2008? - PullRequest
2 голосов
/ 31 января 2012

У меня есть 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; 

1 Ответ

2 голосов
/ 31 января 2012

Нельзя динамически создавать значения кросс-таблицы с помощью 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)

Я не проверял это, очевидно, ноон должен работать (возможно, с небольшими изменениями).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...