2016-03-15 2 views
2

У меня есть таблица под названием продукта, которые отображают данные, как показано ниже:Как группировать по записям на основе года в сервере SQL

--------------------------------- 
l TYPE l PERIOD l BALANCE l 
l Auto l 2015 l  5  l  
l Car l 2015 l  2  l  
l Bus l 2015 l  45  l 
l Auto l 2016 l  2  l  
l Car l 2016 l  6  l  
l Bus l 2016 l  50  l 
l Auto l 2017 l  12  l  
l Car l 2017 l  16  l  
l Bus l 2017 l  10  l 
--------------------------------- 

Мне нужно запросить эту таблицу, так что результат основан на год как показано ниже:

--------------------------------------------------------- 
l TYPE l BALANCE 2015 l BALANCE 2016 l BALANCE 2017 l 
l Auto l  5  l  2  l  12  l 
l Car l  2  l  6  l  16  l 
l Bus l  45  l  50  l  10  l 
--------------------------------------------------------- 

Я пробовал разные запросы, но не повезло.

Ваша помощь будет очень полезна,

Заранее спасибо.

+0

Вы можете использовать PIVOT в MS Sql Server –

+0

MySQL или MS SQL Server? (Различные продукты, и ответ может быть специфичным для продукта.) – jarlh

+0

Если строка 2014 внезапно вставлена, она будет каким-то образом включена в результат? – jarlh

ответ

5

Вы можете использовать условную агрегацию, как это:

SELECT t.type, 
     MAX(CASE WHEN period = 2015 then balance end) as BALANCE_2015, 
     MAX(CASE WHEN period = 2016 then balance end) as BALANCE_2016, 
     MAX(CASE WHEN period = 2017 then balance end) as BALANCE_2017 
FROM Product t 
GROUP BY t.type 

Вы можете добавить несколько столбцов зависит от лет, которые вы хотите отобразить.

+0

Спасибо за запрос, но я не уверен, сколько лет столбца «PERIOD» будет иметь, поэтому я не могу запросить код с периодом 2015,2016,2017. этот запрос может быть изменен, чтобы динамически отображать весь год из таблицы –

1
SELECT * 
FROM (
    SELECT period, type, balance 
    FROM dbo.Product 
) t 
PIVOT (
    MAX(balance) 
    FOR period IN ([2015], [2016], [2017]) 
) p 
1

Вы можете попробовать использовать PIVOT

select [Type],[2015] as BALANCE2015,[2016] as BALANce2016,[2017] as BALANCe2017 from 
(
select [Type],[Period],[Balance] from my_table 
) as t 
pivot 
(
max([Balance]) for Period in ([2015],[2016],[2017]) 
) as pvt 
order by pvt.[Type] 
1

Для вашего сценария, так как «Период» представляет собой столбец таблицы, которая может иметь любое значение, указанное выше метод жесткого кодирования значений не будет хорошим идея.

Вы должны создать динамический запрос PIVOT на основе значений Period.

Оформить заказ следующей ссылкой.

http://www.codeproject.com/Tips/1011591/Dynamic-Pivot-Query-in-SQL-Server

Update:

После запроса, что вам нужно.

DECLARE @ColumnName AS VARCHAR(MAX) 
DECLARE @DynamicPivotQuery AS VARCHAR(MAX) = '' 

SELECT @ColumnName = COALESCE(@ColumnName + ',', '') + QUOTENAME(PERIOD) 
     FROM (SELECT DISTINCT PERIOD FROM Product) T; 

SET @DynamicPivotQuery = N'SELECT [TYPE], ' + @ColumnName + ' FROM Product ' + 
         ' PIVOT(SUM([BALANCE]) FOR PERIOD IN (' + @ColumnName + ')) AS PVTTable;'; 

EXEC (@DynamicPivotQuery) 

Примечание:

Я использовал SUM в качестве агрегатной функции PIVOT, вы можете изменить его на MAX или MIN согласно вашему требованию.