2015-11-02 5 views
0

У меня есть таблица инвентаризации с warehouse, product, and available колонн, выглядит следующим образом:Как создать столбец «Всего» и нижний колонтитул из сводной таблицы?

warehouse product available 
John2196  KITCOMP01 7 
John2196  KITCOMP01 12 
John2196  KITCOMP02 7 
JohnS196  KITCOMP01 9 
JohnS196  KITCOMP03 1 

И колонна склад поворотными для создания этого:

product John2196 JohnS196 
KITCOMP01  19   9 
KITCOMP02  7   NULL 
KITCOMP03 NULL   1 

с этим кодом

DECLARE @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Warehouse) 
       from tlninventory 
       group by Warehouse 
       order by Warehouse 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

set @query = 'SELECT product,' + @cols + ' from 
     (
      select product, warehouse, available 
      from tlninventory 
     ) x 
     pivot 
     (
      sum(available) 
      for warehouse in (' + @cols + ') 
     ) p ' 

execute(@query) 

Теперь я необходимо получить общую колонку и итоговую нижнюю строку, игнорируя значения NULL, но поскольку заголовки создаются с помощью точки опоры и этот запрос будет работать на нескольких таблицах с разными складами и продуктами, то есть заголовки никогда не будут одинаковыми, я не могу суммировать статические столбцы, например, this thread.

Для справки мне нужен финальный стол, который выглядит как:

product John2196 JohnS196 Total 
KITCOMP01  19   9   28 
KITCOMP02  7   NULL  7 
KITCOMP03 NULL   1   1 
Total   26   10  36 
+1

ЗАКАНЧИВАТЬ накопительным, куб, и группировка множества https://technet.microsoft.com/en-us/library/bb522495(v=sql.105).aspx – Jeremy

+0

@Jeremy Will делать. Спасибо! –

ответ

1

Вам нужно сделать несколько вещей здесь.

Сначала создайте новую переменную для хранения «суммы (склад)» колонны

DECLARE @cols AS NVARCHAR(MAX), 
     @sumCols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX) 

Создание столбцов сумм, аналогичные регулярного поворота имена столбцов

select @sumCols = STUFF((SELECT ',' + 'SUM(' + QUOTENAME(Warehouse) + ')' + QUOTENAME(Warehouse) 
       from tlninventory 
       group by Warehouse 
       order by Warehouse 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

теперь вам нужно создать КТР сводного запроса, но добавить оконный sum() over(), чтобы получить строки итогов ..

set @query = ' WITH cte AS 
     (
      SELECT product,' + @cols + ', Total from 
      (
       select product, warehouse, available, sum(available) over (partition by product) total 
       from tlninventory 
      ) x 
      pivot 
      (
       sum(available) 
       for warehouse in (' + @cols + ') 
      ) p 
     ) 

Теперь вы объединяете итоговый столбец в конце, используя ваши столбцы суммы.

set @query = ' WITH cte AS 
     (
      SELECT product,' + @cols + ', Total from 
      (
       select product, warehouse, available, sum(available) over (partition by product) total 
       from tlninventory 
      ) x 
      pivot 
      (
       sum(available) 
       for warehouse in (' + @cols + ') 
      ) p 
     ) 
     SELECT product,' + @cols + ', Total FROM (
      SELECT *, ''a'' sortCol 
      FROM cte 
      UNION ALL 
      SELECT ''Total'', ' + @sumCols + ', sum(total), ''z'' 
      FROM cte 
     ) a 
     ORDER BY sortCol, product' 

execute(@query) 

SQL Fiddle

+0

Это работает безупречно. Спасибо! –

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