2015-06-10 5 views
2

Я видел много примеров с поворотным знаком, но я не нашел ничего, что применимо к моему делу. Надеюсь, кто-то может дать мне руку.Сводный образец с динамическими столбцами

У меня есть эти две таблицы

 
Entities Performance  
+----------+--------+----------+ 
| idEntiry | idWeek | idResult | 
+----------+--------+----------+ 
| 1  | 1  | 1  | 
| 2  | 1  | 1  | 
| 3  | 1  | 2  | 
| 1  | 2  | 3  | 
| 2  | 2  | 1  | 
| 3  | 2  | 2  | 
| 1  | 3  | 3  | 
| 2  | 3  | 1  | 
| …  | …  | …  | 
| 1  | 10  | 1  | 
+----------+--------+----------+ 

Количество недель динамична
Количество субъектов также динамическая

 
Performance details  
+----------+-------------+--------+ 
| idResult | Description | Color | 
+----------+-------------+--------+ 
|  1 | Bad   | Red | 
|  2 | Average  | Yellow | 
|  3 | Good  | Green | 
+----------+-------------+--------+ 

И это желаемый результат

 
      |    Weeks    | 
+----------+---------+---------+------+---+-----+ 
| idEntity | 1  | 2  | 3 | … | 10 | 
+----------+---------+---------+------+---+-----+ 
|  1 | Bad  | Good | Good | … | Bad | 
|  2 | Bad  | Bad  | Bad | … |  | 
|  3 | Average | Average |  | … |  | 
+----------+---------+---------+------+---+-----+ 

Благодаря!

+0

Может ли быть более одного результата на сущность и в неделю? Кроме того, я думаю, что вы столкнетесь с проблемой с «известными именами столбцов», если вы не закроете свои недели в интервалы 10 или какой-нибудь управляемый номер. –

ответ

2

Это может помочь вам подобраться.

DECLARE @WeekStart INT, 
     @WeekEnd INT 

SELECT @WeekStart = MIN(idWeek), 
     @WeekEnd = MAX(idWeek) 
FROM dbo.WeeksTable 

DECLARE @WeekColumns VARCHAR(MAX) 

WHILE @WeekStart < @WeekEnd 
BEGIN 
    SET @WeekColumns = COALESCE(@WeekColumns + '],[', '[') + CONVERT(VARCHAR, @WeekStart) 
    SET @WeekStart = @WeekStart + 1 
END 
SET @WeekColumns = CONCAT(@WeekColumns,'],[',CONVERT(VARCHAR, @WeekStart),']') 

DECLARE @Sql VARCHAR(MAX) = ' 
SELECT idEntity, ' + @WeekColumns + ' FROM 
(
SELECT ep.idEntity, 
     ep.idWeek, 
     pd.Description 
FROM dbo.EntitiesPerformance ep 
     JOIN dbo.PerformanceDetails pd on ep.idResult = pd.idResult 
) src 
PIVOT (
    MIN(Description) 
    FOR idWeek IN (' + @WeekColumns + ') 
) pvt 
' 
EXEC (@Sql)  
+0

С небольшими трюками он работал как шарм! Большое спасибо! – pollardo

Смежные вопросы