динамическая сводная таблица - PullRequest
0 голосов
/ 30 октября 2019
DECLARE @tname VARCHAR(MAX)
 SET @tname=''
 SELECT @tname=@tname+convert(varchar,tcode)+',' FROM Table_maintenancereport
 GROUP BY tcode
 SET @tname=LEFT(@tname,LEN(@tname)-1)

    exec('
    select *
    from
    (select SUM(timedurationok)as wt,tcode
    from Table_maintenancereport
    where (svok=1 and need_netok=0) or (svok=1 and netok=1 and need_netok=1)
    group by tcode
    )t
    pivot (sum(wt) 
    for tname in ('+@tname+'))p')

при выполнении этого запроса sql выдает эту ошибку:

Msg 102, уровень 15, состояние 1, строка 10Неверный синтаксис рядом с '2917'.

tcode - это значение типа int, но я конвертирую его в varchar, это может быть проблемой?!

1 Ответ

0 голосов
/ 30 октября 2019

Я думаю, это то, что вы пытаетесь сделать.

Во-первых, это получить эти различные tcode

Во-вторых, это генерировать строку запроса SQL на основе ваших сгенерированных столбцов

В-третьих, это поворот суммы () каждого tcode

declare @strsql nvarchar(max);
declare @cols nvarchar(max);

select @cols =
    stuff((select N'],[' + tcode
       from (select distinct tcode 
          from Table_maintenancereport where coalesce(tcode, '') != '') AS t1   
       for xml path('')
    ), 1, 2, '') + N']';
select @cols

set @strsql = N'
        select '+@cols+'
        from
        (select timedurationok as wt, tcode
            from Table_maintenancereport    
            where (svok=1 and need_netok=0) or (svok=1 and netok=1 and need_netok=1)
        )t
        pivot (
            sum(t.wt) 
            for t.tcode in ('+@cols+')
        )p'

exec sp_executesql @strsql
...