2015-06-25 3 views
1

У меня есть набор исходных данных, хранящихся в базе данных, которая выглядит следующим образом:Повторяющиеся Столбцы в TSQL Pivot

ReportDate Server AvgAvail outageID 
6/4/2015 CPU1 0.9797 11111111 
6/4/2015 CPU2 0.9999 NULL 
6/4/2015 CPU3 0.9999 NULL 
6/4/2015 CPU4 0.9999 NULL 
6/5/2015 CPU1 0.9999 NULL 
6/5/2015 CPU2 0.9999 NULL 
6/5/2015 CPU3 0.9887 22222222 
6/5/2015 CPU4 0.9999 NULL 
6/6/2015 CPU1 0.9999 NULL 
6/6/2015 CPU2 0.9999 NULL 
6/6/2015 CPU3 0.9999 NULL 
6/6/2015 CPU4 0.9999 NULL 
6/6/2015 CPU5 0.9999 NULL 

Я в настоящее время используют TSQL с динамическим SQL для создания таблицы, поскольку даты отчета могут быть выбраны через сборщик дат. Я хотел бы получить выход выглядеть следующим образом:

Server OutageID 6/4/2015 OutageID 6/5/2015 OutageID 6/6/2015 
CPU1 11111111 0.9797  NULL  0.9999  NULL  0.9999 
CPU2 NULL  0.9999  22222222 0.9887  NULL  0.9999 
CPU3 NULL  0.9999  NULL  0.9999  NULL  0.9999 
CPU4 NULL  0.9999  NULL  0.9999  NULL  0.9999 
CPU5 NULL  NULL  NULL  NULL  NULL  0.9999 

Вот мой текущий SQL:

DECLARE @cols NVARCHAR(2000) 
DECLARE @cols2 NVARCHAR(2000) 
DECLARE @query NVARCHAR(4000) 

SELECT @cols = Coalesce(@Cols+',['+ ReportDate +']','['+ ReportDate+']'), 
@cols2 = Coalesce(@Cols2+',[outageID],['+ ReportDate +']','[outageID],['+ ReportDate+']') 
FROM AVTABLE WHERE ReportDate > getdate() - 22 GROUP BY ReportDate ORDER BY ReportDate 

SET @query = 'SELECT Server,'[email protected]+' FROM AVTABLE AS SRC PIVOT (Min(AvgAvail) FOR ReportDate in ('[email protected]+')) AS PVT' 

EXEC(@query) 

Проблема заключается в том, что Pivot дублирует строки с номерами ППР. Любые мысли о том, как это исправить? TIA

ответ

1

Этот запрос даст вам результаты, которые вы хотите. Не используйте синтаксис pivot.

DECLARE @cols NVARCHAR(2000) ='' 
DECLARE @cols2 NVARCHAR(2000)='' 
DECLARE @query NVARCHAR(4000)='' 

SELECT @cols = @cols + ',[OutageID] = MAX(CASE WHEN ReportDate = '''+CAST(ReportDate as varchar)+''' THEN OutageID END)' 
        + ',['+CAST(ReportDate as varchar)+'] = MAX(CASE WHEN ReportDate ='''+CAST(ReportDate as varchar)+''' THEN avgavail END)' 
FROM AVTABLE GROUP BY ReportDate ORDER BY ReportDate 

SET @query = 'SELECT [server] ' [email protected]+ ' FROM AVTABLE GROUP BY [server] ' 

EXECUTE (@query) 

SQLFiddle for Query

+0

Отлично, что работал как чемпион. Благодаря! –

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