2012-06-27 5 views
3

Imagine У меня есть эта таблица:Как создать сводную запрос

Column A | Column B | Column C 
------------------------------ 
    111   X  10 
    111   Y  12 

Как я могу запросить эту таблицу, чтобы показать результаты, подобные этим:

Column A |  X  |  Y 
----------------------------------- 
    111   10   12 
+1

Что именно неясно после прочтения многих онлайн-примеров оператора 'pivot'? Что вы уже пробовали? – fvu

+1

Обратите внимание, что хотя поворот внутри SQL-сервера является функциональным и может помочь в определенных ситуациях, если вы превысите около 10 опорных точек (столбцов), тогда производительность упадет, как скала. – NotMe

+0

@ChrisLively - Большое спасибо за эту полезную информацию! – Coffee

ответ

7

Вы можете выполнить это через PIVOT. Вы можете использовать любой статический PIVOT, где вы знаете, количество колонок, которые вы хотите повернуть или вы можете использовать динамический PIVOT

Static Pivot (см SQL Fiddle with Demo)

SELECT * 
FROM 
(
    select * 
    from t1 
) x 
pivot 
(
    min(columnc) 
    for columnb in ([X], [Y]) 
) p 

Dynamic Pivot (см SQL Fiddle with Demo)

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(columnb) 
        from t1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT columna, ' + @cols + ' from 
      (
       select * 
       from t1 
      ) x 
      pivot 
      (
       min(ColumnC) 
       for ColumnB in (' + @cols + ') 
      ) p ' 

execute(@query) 

Обе версии дадут те же результаты. Второй работает, когда у вас есть неизвестное количество столбцов, которые будут преобразованы.

3

Try:

DECLARE @tbl TABLE (ColumnA INT, ColumnB CHAR(1), ColumnC INT) 
INSERT @tbl VALUES (111, 'X', 10), (111, 'Y', 12) 

SELECT * 
FROM @tbl 
PIVOT 
(
    MAX(ColumnC) FOR ColumnB IN ([X], [Y]) 
) pvt 
Смежные вопросы