2015-01-19 5 views
0

У меня есть действующий сводный запрос для значений статических столбцов, которые я хочу преобразовать для динамических значений столбцов.Динамический сводный запрос в sql-сервере

Этот запрос:

with a as (

select request_id, dateadd(month,datediff(month,0,logged_datetime),0) as 'Month' 
,dateadd(month,datediff(month,0,logged_datetime),0) as 'Year' 

from requests 

) 


select * from (

select datepart(m,a.Month) as 'months',datepart(YEAR,a.Year) as 'years',a.request_id 

    from a ) ps 

pivot (

count(request_id) for [years] in ([2008],[2009],[2010],[2011],[2012],[2013],[2014],[2015]) 
) as pvt 
order by months 

Для динамического запроса приведённой ниже я получаю ошибки как

Msg 207, уровень 16, состояние 1, строка 5 Неверное имя столбца '2010'. :

select distinct datepart(year,dateadd(month,datediff(month,0,logged_datetime),0)) as 'Yearz' 

into #t 

FROM requests 

DECLARE @Dynamic AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME(Yearz) 
FROM (SELECT * from #t) AS Yea 


SET @Dynamic = 
    N' 

select * from (

select datepart(m,dateadd(month,datediff(month,0,logged_datetime),0)) as months,' + @ColumnName + ',request_id 

    from requests) ps 

pivot (

count(request_id) for [Years] in (' + @ColumnName + ') 
) as pvt 
order by months 
' 

EXEC sp_executesql @Dynamic 
+1

Так что это проблема –

+0

@NoDisplayName D ynamic query, который Im пытается не работает. Получение ошибок. – Crabster

+0

Обнаружено, что он удаляет '+ @ColumnName +' из исходного запроса. Попробуйте это .'..выберите datepart (m, dateadd (месяц, датфик (месяц, 0, logged_datetime), 0)) как месяцы, request_id из запросов ..' –

ответ

0

ОБРАЗЦА ТАБЛИЦА

SELECT * INTO #REQUESTS 
FROM 
(
    SELECT 1 request_id, '2012-06-01' logged_datetime 
    UNION ALL 
    SELECT 2 request_id, '2012-05-01' 
    UNION ALL 
    SELECT 11 request_id, '2012-06-01' 
    UNION ALL 
    SELECT 12 request_id, '2012-05-01' 
    UNION ALL 
    SELECT 3 request_id, '2012-07-01' 
    UNION ALL 
    SELECT 4 request_id, '2013-09-01' 
    UNION ALL 
    SELECT 5 request_id, '2013-10-01' 
    UNION ALL 
    SELECT 6 request_id, '2014-01-01' 
    UNION ALL 
    SELECT 7 request_id, '2014-02-01' 
    UNION ALL 
    SELECT 8 request_id, '2014-03-01' 
    UNION ALL 
    SELECT 9 request_id, '2014-05-01' 
    UNION ALL 
    SELECT 10 request_id, '2015-11-01' 
)TAB 

QUERY

Получить колонку для years и порядок его в числовом порядке

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + CAST([YEAR] AS VARCHAR(4)) + ']', '[' + CAST([YEAR] AS VARCHAR(4)) + ']') 
       FROM (SELECT DISTINCT YEAR(dateadd(month,datediff(month,0,logged_datetime),0)) [YEAR] FROM #REQUESTS) PV 
       ORDER BY CAST([YEAR] AS INT) 

Теперь откинуть запрос

DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      ( 
       -- We will get the count for a year and number of request_id in that month here as CNT column 
       select DISTINCT datepart(m,a.Month) as ''months'',datepart(YEAR,a.Year) as ''years'', 
       COUNT(*) OVER(PARTITION BY datepart(YEAR,a.Year),datepart(m,a.Month)) CNT 
       from 
       (
        select request_id, dateadd(month,datediff(month,0,logged_datetime),0) as ''Month'' 
        ,dateadd(month,datediff(month,0,logged_datetime),0) as ''Year'' 
        from #requests 
       )a 
      ) x 
      PIVOT 
      (
       MIN(CNT) 
       FOR years IN (' + @cols + ') 
      ) p 
      ORDER BY MONTHS;' 

EXEC SP_EXECUTESQL @query 
  • Click here для просмотра результата
0

Я думаю, что вам нужно обернуть ваши динамические имена столбцов с помощью QUOTENAME функции:

См пример here:

+0

Используется 'Quotename'. '+ QUOTENAME (Yearz) FROM (SELECT * from #t)' –

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